使用lxml和requests进行HTML抓取时出现Unicode错误
我正在尝试使用一个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.text
和 lxml.etree
都想把 utf-8 解码成 Unicode。但是如果我们让 requests.text
来解码的话,XML 文件里的编码声明就会变成谎言。
所以,让 requests.content
不进行解码。这样 lxml
就能收到一个始终未解码的文件。