【问题标题】:Apostrophes are printing out as â\x80\x99撇号打印为 â\x80\x99
【发布时间】:2018-01-14 07:02:39
【问题描述】:
import requests
from bs4 import BeautifulSoup
import re

source_url = requests.get('http://www.nytimes.com/pages/business/index.html')
div_classes = {'class' :['ledeStory' , 'story']}
title_tags = ['h2','h3','h4','h5','h6']

source_text = source_url.text
soup = BeautifulSoup(source_text, 'html.parser')


stories = soup.find_all("div", div_classes)

h = []; h2 = []; h3 = []; h4 =[]

for x in range(len(stories)):

    for x2 in range(len(title_tags)):
        hold = []; hold2 = []
        hold = stories[x].find(title_tags[x2])

        if hold is not None:
            hold2 = hold.find('a')

            if hold2 is not None:
                hh = (((hold.text.strip('a'))).strip())
                h.append(hh)
                #h.append(re.sub(r'[^\x00-\x7f]',r'', ((hold.text.strip('a'))).strip()))
                #h2.append(hold2.get('href'))

    hold = []
    hold = stories[x].find('p')

    if hold is not None:
        h3.append(re.sub(r'[^\x00-\x7f]',r'',((hold.text.strip('p')).strip())))

    else:
        h3.append('None')


h4.append(h)
h4.append(h2)
h4.append(h3)
print(h4)

大家好。我一直想抓取一些数据,当我注意到打印输出将 (') 替换为 (â\x80\x99) 时,我几乎完成了我的抓取。例如,包含“China's”的标题是“Chinaâ\x80\x99s”。我做了一些研究并尝试使用解码/编码(utf-8)但无济于事。它只会告诉我你不能在 str() 上运行解码。我尝试使用 re.sub() 可以让我删除 (â\x80\x99) 但不会让我用 (') 替换它因为我想使用自然语言处理来解释数据担心没有撇号将大大改变含义。非常感谢您的帮助,我觉得我遇到了这个问题。

【问题讨论】:

    标签: python string utf-8 byte


    【解决方案1】:

    在 ISO 8859-1 和相关代码集(有很多)中,â 的代码点为 0xE2。当您将三个字节 0xE2、0x80、0x99 解释为 UTF-8 编码时,该字符为 U+2019,右单引号(即 ' 或 ’,与 ' 或 ' 不同 — 您可以或可能无法发现差异)。

    我认为您的困难的根源有几种可能性,其中任何一种或多种都可能是您的麻烦的根源:

    1. 您的终端未设置为解释 UTF-8。
    2. 您的源代码应使用'(U+0027,APOSTROPHE)。
    3. 您使用的是 Python 2.x 而不是 Python 3.x,并且由于使用 Unicode (UTF-8) 而出现问题。与此相反(如 Cory Madden pointed out),代码以 print(h4) 结尾,即 Python 3,所以这可能不是问题。

    将引号更改为 ASCII 撇号可能是最简单的。

    另一方面,如果您从其他地方分析 HTML,您可能必须考虑您的脚本将如何处理 UTF-8。使用 Unicode U+20xx 范围内的引号是很常见的选择;也许你的刮刀需要处理它?

    【讨论】:

    • 代码示例的最后一行暗示它是 Python 3.x
    • @CoryMadden:是的,你是对的。所以选项 3 可能(几乎可以肯定)不相关。
    • 糟糕,我误读了它,因为所有这些标准都是问题所在。
    • 我将研究如何设置我的终端来解释 UTF-8。您能否使用 ' 解释更多有关源代码的信息?我不确定如何纠正。
    • “将引号更改为 ASCII 撇号可能是最简单的”你介意告诉我如何做到这一点吗?
    【解决方案2】:

    我在使用 requests 抓取数据,然后使用 BeautifulSoup 解析时遇到了同样的问题。

    here 的这个解决方案很适合我:

    soup = BeautifulSoup(r.content.decode('utf-8'),"lxml")
    

    如果这不起作用,在.get_text() 或.text 之后添加.encode('latin1').decode('utf-8') 也可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 2017-12-05
      • 2011-04-11
      • 2021-05-25
      • 2017-07-15
      • 2021-06-15
      • 1970-01-01
      相关资源
      最近更新 更多