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),但不会让我用(')替换它因为我想使用自然语言处理来解释数据恐惧没有撇号很大程度上改变了意义。非常感谢帮助,我觉得我已经遇到了这个问题。
答案 0 :(得分:1)
在ISO 8859-1及相关代码集(其中有许多代码集)中,â
的代码点为0xE2。当您将三个字节0xE2,0x80,0x99解释为UTF-8编码时,该字符为U + 2019,右单引号(即{或’
,与''
不同 - 你可能会或可能不会发现差异。)
我看到了一些可能导致您遇到困难的可能性,其中任何一个或多个可能是您遇到麻烦的根源:
'
(U + 0027,APOSTROPHE)。将引号更改为ASCII撇号可能最简单。
另一方面,如果您要从其他地方分析HTML,则可能必须考虑脚本将如何处理UTF-8。使用Unicode U + 20xx系列中的引号是一种非常常见的选择;也许你的刮刀需要处理它?</ p>
答案 1 :(得分:0)
我在使用 requests
抓取数据,然后使用 BeautifulSoup 对其进行解析时遇到了同样的问题。
来自 here 的这个解决方案对我很有效:
soup = BeautifulSoup(r.content.decode('utf-8'),"lxml")
如果这不起作用,在 .encode('latin1').decode('utf-8')
或 .get_text()
后添加 .text
也可以解决问题。