前言

我在解决提取第二段所需文字的时候,出了一个问题,一个大问题——多余的空格。

首先,我不知道百度为什么要加上这个看起来根本没有卵用的空格。

<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(>(.*)</) 括号内的括号代表所要提取的内容


发表评论

电子邮件地址不会被公开。 必填项已用*标注