使用lxml和request进行HTML抓取会产生unicode错误

时间:2014-07-29 19:15:15

标签: python html unicode web-scraping lxml

我正在尝试像提供here的HTML刮刀一样使用HTML抓取工具。它适用于他们提供的示例。但是,当我尝试将其与webpage一起使用时,我收到此错误 - Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration. 我试过谷歌搜索但无法找到解决方案。我真的很感激任何帮助。我想知道是否有办法使用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 个答案:

答案 0 :(得分: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

  
    

请求将自动解码服务器中的内容[r.text]。 ...您还可以以字节[作为r.content]。

的形式访问响应正文   

所以你看,requests.textlxml.etree想要将utf-8解码为unicode。但是如果我们让requests.text进行解码,那么xml文件中的编码语句就变成了谎言。

所以,让我们requests.content不解码。这样lxml将收到一致的未解码文件。