2 回答
TA贡献1848条经验 获得超10个赞
您不想忽略这些字符。它们表示您收到的数据已使用错误的字符编码进行解码。在您的情况下requests,错误地猜测编码是latin-1. 真正的编码是在 HTML 响应utf-8的<meta>标签中指定的。requests是一个用于处理 HTTP 的库,它不了解 HTML。由于Content-Type标头未指定编码,因此requests只能猜测编码。BeautifulSoup但是,它是一个用于处理 HTML 的库,它非常擅长检测编码。因此,您希望从响应中获取原始字节并将其传递给BeautifulSoup. IE。
from bs4 import BeautifulSoup
import requests
response = requests.get("https://mattgemmell.com/network-link-conditioner-in-lion/")
data = response.content # we now get `content` rather than `text`
assert type(data) is bytes
soup = BeautifulSoup(data, 'lxml')
article = soup.find_all('article')[0]
text = article.find_all('p')[1].text
print(text)
assert type(text) is str
assert 'Mac OS X 10.7 “Lion”' in text
TA贡献1818条经验 获得超7个赞
使用第三个参数来bytes告诉它如何处理错误:
converted_text = bytes(text, 'latin-1', 'ignore')
^^^^^^
你会丢失箭头,但其他一切都完好无损:
>>> text = '\n← Find Patterns in text on Lion\nUsing Spaces on OS X Lion →\n'
>>> converted_text = bytes(text, 'latin-1', 'ignore')
>>> converted_text
'\n Find Patterns in text on Lion\nUsing Spaces on OS X Lion \n'
以下是有关文档中参数的更多信息 - https://docs.python.org/3.3/howto/unicode.html:
errors 参数指定无法根据编码规则转换输入字符串时的响应。此参数的合法值为“strict”(引发 UnicodeDecodeError 异常)、“replace”(使用 U+FFFD、REPLACEMENT CHARACTER)或“ignore”(仅将字符排除在 Unicode 结果之外)。
添加回答
举报