Python3: 编辑通过urllib获取的数据

Python3: Editing data acquired with urllib

我用 urllib 编写了一个程序,可以从网页中获取所有文章标题(在本例中 nytimes.com)。只有一个问题。有些标题有一个分号,如果打印出来会导致难看的 "There\xe2\x80\x99s"。所以我尝试用 ' 替换 \xe2\x80\x99 但它似乎不起作用。我认为元组有问题。不幸的是,我无法创建元组,这会导致同样的问题。

import urllib.request
import urllib.parse
import re

url = 'https://www.nytimes.com/'
headers = {}
headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux i686)' 

req = urllib.request.Request(url, headers = headers)
resp = urllib.request.urlopen(req)
resp_data = resp.read()
par = re.findall(r'story-heading"><a href="(.*?)">(.*?)</a>',str(resp_data))

for n in par:
print(n[1])
print(n[1].replace("\xe2\x80\x99","'"))

我尝试从元组创建字符串变量,但没有任何效果。我知道 BeautifulSoup 有另一种解决方案,但我想我会尝试找到自己的方法。

您看到的是字符串的 repr(),因此是有趣的字符。如果需要,将其强制转换为字符串。查看我的结果:

>>> print repr(n[1])
'There\xe2\x80\x99s'
>>> print str(n[1])
There’s

总结:将您的 n[1] 包装在 str()

您必须更改这一行:

resp_data = resp.read()

至:

resp_data = resp.read().decode("utf8")

工作将会完成。

解释:

该网站正在使用 ut8 编码,正如我猜测的那样,因此您必须 decode 将返回的字节转换为 utf8 可以更好地表示的字符串打算有。

PS: 您可以在 decode() 方法中不带参数地使用 resp.read().decode() 并让 Python 猜测编码类型。