即使编码为 utf-8 也有奇怪的字符

There are weird characters even though it's encoded utf-8

尽管有很多解决方案,但我还是花了最后 3 个小时来解决这个问题。它只是对我不起作用,我怀疑我正在废弃的 website 是否已损坏,但 Firefox 完美地显示了内容。正如我所说,这是之前问过的,但我认为有区别我的代码,我想了解它是什么。

from bs4 import BeautifulSoup
import requests

html_text = requests.get('link_for_scrapping').text

soup = BeautifulSoup(html_text, 'lxml')
print(soup.encoding)
soup.encoding = 'utf-8'
print(soup.encoding)

输出:

None
utf-8

为什么一开始编码为“None”?我要查找的内容是用土耳其字符写的,但在其他人的代码中,它们并没有被编码为“None”。它们类似于“ISO-xxxx-x”或其他东西

此外,当我将其转换为“utf-8”时,没有任何变化。还有同样的奇怪字符。

如果我们添加这段代码,我们会看得更清楚:

menu = soup.find(class_="panel-grid-cell col-md-6").text
print(menu)

输出:

None
utf-8
1) 31.01.2022 Pazartesi Yemekler : 
Mercimek Ãorba Fırın Patates Mor Dünya Salatası Sıhhiye Kırmızı Lahana Havuç Salata Elma *Etsiz PatatesKalori : 1099

无论我是否将编码更改为 utf-8,问题仍然存在。

预期输出:

None
utf-8
1) 31.01.2022 Pazartesi Yemekler : 
Mercimek Çorba Fırın Patates Mor Dünya Salatası Sıhhiye Kırmızı Lahana Havuç Salata Elma *Etsiz PatatesKalori : 1099

提前致谢!

问题:

import requests
r = requests.get('link')
print(r.encoding)

输出:ISO-8859-1

服务器未发送适当的 header,requests 不解析 <meta charset="utf-8" />,因此默认为 ISO-8859-1。

解决方案 1:告诉请求使用什么编码

r.encoding = 'utf-8'
html_text = r.text

方案二:自己解码

html_text = r.content.decode('utf-8')

解决方案 3:让请求进行猜测

r.encoding = r.apparent_encoding
html_text = r.text

在任何情况下,html_text 现在将包含(正确解码的)html 源并且可以馈送到 BeautifulSoup。

BeautifulSoup 的编码设置没有帮助,因为那时你已经有一个错误解码的字符串!