bet*_*eta 5 python encoding utf-8 python-requests
我在解析这个网站时遇到问题:http : //fm4-archiv.at/files.php?cat=106
正如您在上面的屏幕截图中看到的那样,我的 chrome 浏览器正确显示了变音符号。但是在其他页面上(例如:http : //fm4-archiv.at/files.php?cat = 105),变音没有正确显示,如下面的屏幕截图所示:

元 HTML 标记在页面上定义了以下字符集:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
Run Code Online (Sandbox Code Playgroud)
我使用 python requests 包来获取 HTML,然后使用 Beautifulsoup 来抓取所需的数据。我的代码如下:
r = requests.get(URL)
soup = BeautifulSoup(r.content,"lxml")
Run Code Online (Sandbox Code Playgroud)
如果我打印编码 ( print(r.encoding),结果是UTF-8. 如果我在控制台上输出数据时手动将编码更改为ISO-8859-1或cp1252通过调用r.encoding = ISO-8859-1没有任何更改。这也是我的主要问题。
r = requests.get(URL)
r.encoding = 'ISO-8859-1'
soup = BeautifulSoup(r.content,"lxml")
Run Code Online (Sandbox Code Playgroud)
仍然会在我的 python IDE 的控制台输出中显示以下字符串:
Der Wildlöwenpfleger
Run Code Online (Sandbox Code Playgroud)
相反,它应该是
Der Wildlöwenpfleger
Run Code Online (Sandbox Code Playgroud)
如何更改我的代码以正确解析变音符号?
一般来说,不是使用r.contentwhich 是接收到的字节串,而是使用which 是r.text使用由 确定的编码的解码内容requests。
在这种情况下requests将使用 UTF-8 来解码传入的字节字符串,因为这是服务器在Content-Type标头中报告的编码:
import requests
r = requests.get('http://fm4-archiv.at/files.php?cat=106')
>>> type(r.content) # raw content
<class 'bytes'>
>>> type(r.text) # decoded to unicode
<class 'str'>
>>> r.headers['Content-Type']
'text/html; charset=UTF-8'
>>> r.encoding
'UTF-8'
>>> soup = BeautifulSoup(r.text, 'lxml')
Run Code Online (Sandbox Code Playgroud)
这将解决“Wildlöwenpfleger”问题,但是,页面的其他部分随后开始中断,例如:
>>> soup = BeautifulSoup(r.text, 'lxml') # using decoded string... should work
>>> soup.find_all('a')[39]
<a href="details.php?file=1882">Der Wildlöwenpfleger</a>
>>> soup.find_all('a')[10]
<a href="files.php?cat=87" title="Stermann und Grissemann sind auf Sommerfrische und haben Hermes ihren Salon ?bergeben. Auf Streifz?gen durch die Popliteratur st??t Hermes auf deren gro?e Themen und h?rt mit euch quer. In der heutige">Salon Hermes (6 files)
Run Code Online (Sandbox Code Playgroud)
显示“Wildlöwenpfleger”已修复,但现在第二个链接中的“übergeben”和其他人已损坏。
似乎在一个 HTML 文档中使用了多种编码。第一个链接使用 UTF-8 编码:
>>> r.content[8013:8070].decode('iso-8859-1')
'<a href="details.php?file=1882">Der Wildlöwenpfleger</a>'
>>> r.content[8013:8070].decode('utf8')
'<a href="details.php?file=1882">Der Wildlöwenpfleger</a>'
Run Code Online (Sandbox Code Playgroud)
但第二个链接使用 ISO-8859-1 编码:
>>> r.content[2868:3132].decode('iso-8859-1')
'<a href="files.php?cat=87" title="Stermann und Grissemann sind auf Sommerfrische und haben Hermes ihren Salon übergeben. Auf Streifzügen durch die Popliteratur stößt Hermes auf deren große Themen und hört mit euch quer. In der heutige">Salon Hermes (6 files)\r\n</a>'
>>> r.content[2868:3132].decode('utf8', 'replace')
'<a href="files.php?cat=87" title="Stermann und Grissemann sind auf Sommerfrische und haben Hermes ihren Salon ?bergeben. Auf Streifz?gen durch die Popliteratur st??t Hermes auf deren gro?e Themen und h?rt mit euch quer. In der heutige">Salon Hermes (6 files)\r\n</a>'
Run Code Online (Sandbox Code Playgroud)
显然,在同一个 HTML 文档中使用多种编码是不正确的。除了联系文档作者并要求更正之外,您无法轻松处理混合编码。也许您可以chardet.detect()在处理数据时处理它,但这不会令人愉快。
| 归档时间: |
|
| 查看次数: |
7252 次 |
| 最近记录: |