前言
我在解决提取第二段所需文字的时候,出了一个问题,一个大问题——多余的空格。
首先,我不知道百度为什么要加上这个看起来根本没有卵用的空格。
<div class="op_exactqa_s_answer">
距今还有201天
<span class="op_exactqa_s_answer_property">(2019年06月07日 星期五,己亥年(猪年)五月初五)</span>
</div>
<span>
那里可以用正则提取出来我就算了,可是!!为神马要在 <div>
那里加上一堆空格 (抓狂)
但是,遇到问题了,总得解决。
于是,我百度各种Python去除字符串中空格的方法,具体有以下几种:
1:strip()方法,去除字符串开头或者结尾的空格
>>> a = " a b c "
>>> a.strip()
'a b c'
2:lstrip()方法,去除字符串开头的空格
>>> a = " a b c "
>>> a.lstrip()
'a b c '
3:rstrip()方法,去除字符串结尾的空格
>>> a = " a b c "
>>> a.rstrip()
' a b c'
4:replace()方法,可以去除全部空格
# replace主要用于字符串的替换replace(old, new, count)
>>> a = " a b c "
>>> a.replace(" ", "")
'abc'
5: join()方法+split()方法,可以去除全部空格
# join为字符字符串合成传入一个字符串列表,split用于字符串分割可以按规则进行分割
>>> a = " a b c "
>>> b = a.split() # 字符串按空格分割成列表
>>> b ['a', 'b', 'c']
>>> c = "".join(b) # 使用一个空字符串合成列表内容生成新的字符串
>>> c 'abc'
# 快捷用法
>>> a = " a b c "
>>> "".join(a.split())
'abc'
然鹅,并没有一个有卵用!
后来,我使用
print type(soup1)
等等语句,查看了各个变量的类型后,发现,原来变量类型不同(有的是 list 有的是 str,且 list 无法使用以上方法删除空格),并且字符编码还不同。
于是我需要解决这两个问题,我决定先解决变量类型的问题。我搜索了百度,找到以下资料:
str3 = ''.join([str(i) for i in str2])
转换了倒是转换了,字符编码还是有问题(问题出在re.findall()后转换了字符编码),经过查看 小Pi音响 的代码找到了解决方法(都是把 list 变成 字符串,不知道为什么不同)
代码如下:
t = '' #两个单引号
for x in range(len(str2[0])):
t += str2[0][x]
转换后,终于可以正常删除空格了。
全部代码如下:
# -*- coding:utf-8 -*-
import requests
import re
from bs4 import BeautifulSoup
#url = 'https://blog.csdn.net/Darkman_EX/article/details/80973656'
url = 'https://www.baidu.com/s'
payload = {'ie':'utf8', 'wd':'高考日的倒计时'}
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
def getHtmlText(url,payload,code='utf-8'):
try:
r = requests.get(url, params=payload)
r.raise_for_status()
#print r.text
#print r.url
r.encoding = code
#print r.text
return r.text
except:
return ''
def makeSoup(html):
if html == '':
return '抓不到数据了'
else:
# 用BeautifulSoup 打开 本地html代码,打开方式 html.parser
# soup = BeautifulSoup(open('index.html'),'html.parser')
soup = BeautifulSoup(html,'html.parser')
# .p 代表 Tag 是 <p>
# .contents 属性可以将tag的子节点以列表的方式输出
# 我们可以用列表索引来获取它的某一个元素
# .string 用于去掉多余符号
msg = soup.p.contents[1].string + soup.p.contents[2].string + '\n'
# 截取下第0个 <div> tag 的内容
soup1 = soup.find_all('div',attrs = {'class':'op_exactqa_s_answer'})[0]
# 从 list 类型转换成 str 类型 (方便操作)
str1 = str(soup1)
# 使用正则提取出所需文字 (此时编码会变为 'ascii')
str2 = re.findall(r'>(.*)<sp.*ty">(.*)</s',str1,re.S)
# 下面这是一种把 list 转换成 字符串的方法:
# ...str3 = ''.join([str(i) for i in str2])
# 另一种把 list 转换成字符串的方法:
# ...使用新变量 t 来储存
# ...一个个遍历并放进 t 中
t = ''
for x in range(len(str2[0])):
t += str2[0][x]
# 使用这个方法删除字符串中的空格:
# ...曾经是 list 类型,现在改了就好了
# ...不把类型改为字符串无法使用,空格困扰了我很久
str3 = "".join(t.split())
# 使用 .encode('') 转码:
# ...统一转码为 'utf-8'
# ...再返回,由json.dump,转为json
msg = msg.encode('utf-8')
msg = msg + str3
return msg
#
#print type(soup.p)
def get_GK_TIME(url=url, payload=payload):
HtmlText = getHtmlText(url,payload)
msg = makeSoup(HtmlText)
return msg
def main():
get_GK_TIME()
if __name__ == '__main__':
main()
总结
- list 无法使用操作字符串的方法删除空格
- 字符串可以使用 list 的操作 (例: a[4:] + b[:2] )
r' '
表示单引号内使用正则表达式.*
代表匹配任意数量任意字符.*?
代表匹配任意数量任意字符(尽量少)re.findall(>(.*)</)
括号内的括号代表所要提取的内容