为了账号安全,请及时绑定邮箱和手机立即绑定

Python 'latin-1' 编解码器无法编码字符 - 如何忽略字符?

Python 'latin-1' 编解码器无法编码字符 - 如何忽略字符?

函数式编程 2021-11-09 20:33:22
这是我的代码的要点。它试图从旧网站获取一些文本。这不是我的,所以我不能改变来源。from bs4 import BeautifulSoupimport requestsresponse = requests.get("https://mattgemmell.com/network-link-conditioner-in-lion/")data = response.textsoup = BeautifulSoup(data, 'lxml')article = soup.find_all('article')[0]text = article.find_all('p')[1].text print(text)给出了这个:“如果你——x80\x99 是使用网络的 Mac 或 iOS 应用程序的开发人员,那么——x80\x99s Mac OS X 10.7 的开发人员工具中的一项新功能——x80\x9cLion——x80\x9d(阅读我对它在卫报)这对你有用。这篇简短的文章描述了它是如何工作的。我可以用它来转换像 â\x80\x99 这样的部分:converted_text = bytes(text, 'latin-1').decode('utf-8')实际上有效。但是如果你得到文本的不同部分:text = article.find_all('p')[8].text 给我:'\n← 在 Lion 上的文本中查找模式\n在 OS X Lion 上使用 Spaces →\n'使用bytes(text, 'latin-1')给了我:'latin-1' 编解码器无法在位置 1 中对字符 '\u2190' 进行编码:序号不在范围内 (256)我猜是箭头?我怎样才能让它自动忽略和丢弃所有非拉丁字符。任何想法都会最有帮助!
查看完整描述

2 回答

?
慕桂英546537

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


查看完整回答
反对 回复 2021-11-09
?
qq_笑_17

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 结果之外)。


查看完整回答
反对 回复 2021-11-09
  • 2 回答
  • 0 关注
  • 424 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信