使用lxml和requests进行HTML抓取时出现Unicode错误

21 投票
1 回答
8290 浏览
提问于 2025-04-18 15:14

我正在尝试使用一个HTML抓取工具,类似于这里提供的那个。它在他们给的例子中运行得很好。不过,当我试着用它去抓取我的网页时,出现了一个错误 - 不支持带有编码声明的Unicode字符串。请使用字节输入或没有声明的XML片段。我试着在网上搜索,但找不到解决办法。非常感谢任何帮助。我想知道有没有办法用Python将其复制为HTML。

编辑:

from lxml import html
import requests
page = requests.get('http://cancer.sanger.ac.uk/cosmic/gene/analysis?ln=PTEN&ln1=PTEN&start=130&end=140&coords=bp%3AAA&sn=&ss=&hn=&sh=&id=15#')
tree = html.fromstring(page.text)

谢谢。

1 个回答

52

简单来说:用 page.content,不要用 page.text

来自 http://lxml.de/parsing.html#python-unicode-strings 的内容:

lxml.etree 的解析器可以直接处理 Unicode 字符串……不过,这要求 Unicode 字符串本身不能指定一个冲突的编码,否则就会对它们真实的编码撒谎。

来自 http://docs.python-requests.org/en/latest/user/quickstart/#response-content 的内容:

Requests 会自动解码来自服务器的内容 [用 r.text]……你也可以把响应的内容当作字节流来访问 [用 r.content]。

所以你看,requests.textlxml.etree 都想把 utf-8 解码成 Unicode。但是如果我们让 requests.text 来解码的话,XML 文件里的编码声明就会变成谎言。

所以,让 requests.content 不进行解码。这样 lxml 就能收到一个始终未解码的文件。

撰写回答