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â\x80\x99s”。我做了一些研究,并尝试使用解码/编码(utf-8),但无济于事。它只会告诉我您不能在str()上运行解码。我尝试使用re.sub()来删除(âx80\x99),但不允许我将其替换为('),因为我想使用自然语言处理来解释数据,因此担心没有撇号将会大大改变含义。非常感谢您的帮助,我觉得自己对此有所帮助。

最佳答案

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

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

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

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

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

    10-06 06:30