如何使用 BeautifulSoup 正确解析 UTF-8 编码的 HTML 为 Unicode 字符串? [复制]

2023-12-15

我正在运行一个 Python 程序,该程序获取 UTF-8 编码的网页,并使用 BeautifulSoup 从 HTML 中提取一些文本。

但是,当我将此文本写入文件(或在控制台上打印)时,它会以意外的编码写入。

示例程序:

import urllib2
from BeautifulSoup import BeautifulSoup

# Fetch URL
url = 'http://www.voxnow.de/'
request = urllib2.Request(url)
request.add_header('Accept-Encoding', 'utf-8')

# Response has UTF-8 charset header,
# and HTML body which is UTF-8 encoded
response = urllib2.urlopen(request)

# Parse with BeautifulSoup
soup = BeautifulSoup(response)

# Print title attribute of a <div> which uses umlauts (e.g. können)
print repr(soup.find('div', id='navbutton_account')['title'])

运行此命令给出结果:

# u'Hier k\u0102\u015bnnen Sie sich kostenlos registrieren und / oder einloggen!'

但我希望渲染一个 Python Unicode 字符串ö在这个词中können as \xf6:

# u'Hier k\xf6bnnen Sie sich kostenlos registrieren und / oder einloggen!'

我尝试将“fromEncoding”参数传递给 BeautifulSoup,并尝试read() and decode() the response对象,但它要么没有什么区别,要么抛出错误。

通过命令curl www.voxnow.de | hexdump -C,我可以看到该网页确实是UTF-8编码的(即它包含0xc3 0xb6) 为了ö特点:

      20 74 69 74 6c 65 3d 22  48 69 65 72 20 6b c3 b6  | title="Hier k..|
      6e 6e 65 6e 20 53 69 65  20 73 69 63 68 20 6b 6f  |nnen Sie sich ko|
      73 74 65 6e 6c 6f 73 20  72 65 67 69 73 74 72 69  |stenlos registri|

我超出了我的Python能力的限制,所以我不知道如何进一步调试它。有什么建议吗?


正如 justhalf 上面指出的,我的问题本质上是重复的这个问题.

HTML 内容将自身报告为 UTF-8 编码,并且除了一两个恶意无效 UTF-8 字符外,大部分内容都是如此。

这显然让 BeautifulSoup 混淆了正在使用的编码,以及在将内容传递给 BeautifulSoup 时尝试首先解码为 UTF-8 时 这:

soup = BeautifulSoup(response.read().decode('utf-8'))

我会得到错误:

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 186812-186813: 
                    invalid continuation byte

更仔细地观察输出,有一个角色的实例Ü它被错误地编码为无效字节序列0xe3 0x9c,而不是正确的0xc3 0x9c.

作为目前评分最高的答案关于这个问题表明,可以在解析时删除无效的 UTF-8 字符,以便仅将有效数据传递给 BeautifulSoup:

soup = BeautifulSoup(response.read().decode('utf-8', 'ignore'))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 BeautifulSoup 正确解析 UTF-8 编码的 HTML 为 Unicode 字符串? [复制] 的相关文章

随机推荐

  • 为每个单选按钮分配 2 个值

    我试图为每个单选按钮分配 2 个值 以在 2 个字段中输出 但这不起作用 这是我使用的代码 p What s your favorite browser p
  • 我是否误解了heredoc应该做什么?

    我对 PHP 很陌生 所以我知道我在这里遗漏了一些明显的东西 我认为heredoc函数应该保留格式 换行符等 但每当我测试它时 它解析时都没有格式化 我尝试了很多不同的脚本 包括来自 PHP net 和 W3schools 等来源的复制粘贴
  • Excel VBA 在函数中合并单元格

    我编写了一个粗略的函数来根据范围选择和连接单元格 Function GetSkills CellRef As String CellRefEnd As String Delimiter As String Dim CellStart As
  • 非整数的错误“整数输入语法无效”?

    我正在使用 Python 和 psycopg2 我正在尝试执行带有值列表的准备好的语句 如下所示 cur callproc prepared func prepared values psycopg2 DataError invalid i
  • 无法在 xcode 4.2 上构建我的项目

    我已将我的 xcode 升级到 4 2 使用雪豹 以前我使用的是 Xcode 3 2 6 我的项目使用它成功构建 现在我无法构建它 而是 Xcode 发出以下错误 ld warning option A is obsolete and be
  • 将生成的 img 嵌入 django 模板中

    我如何将生成的图像嵌入 django 模板中 就像是 return render to response graph html img get graph 我不想要这个 因为它只是发送图像 http HttpResponse get gra
  • FFmpeg从mp4创建m3u8,视频文件大小

    我正在使用 ffmpeg 将 mp4 转换为 m3u8 但首先我需要让 mp4 变小 我使用这段代码来缩小它 ffmpeg i big mp4 b 1000000 small mp4 然后我使用这段代码将其转换为m3u8 ffmpeg i
  • Vue 3 自定义复选框组件,带有 v-model 和项目数组

    迫切需要你们的帮助 所以基本上我有一个带有 v 模型的自定义复选框组件 我在组件上使用 v for 循环来显示带有数组中名称的复选框 在父组件中 我有两列 可用 和 选定 这个想法是 如果我选中其中一个框可用栏它应该出现在选定的列 问题是它
  • 设置 win32 控制台应用程序的库路径

    当我尝试执行简单的 HelloWorld win32 控制台应用程序时 出现 找不到 dll 重新启动应用程序可能会解决问题 错误 我知道 dll 的位置 从命令提示符执行 exe 时如何指定其位置 PS 将 dll复制到 exe的当前目录
  • Doctrine2:这些实体之间的关联有什么问题?

    我正在尝试通过简单的示例来了解 Doctrine2 中的所有更改 请查看以下实体片段 VCat php namespace Application Models Entity Table name v cat class VCat Id C
  • UITableViewCell 中加载 UIView 的 Nib 文件不会拉伸

    我有一个 UIView 可以通过 nib xib 文件重用 我想加载它并填充一个 UITableViewCell 它将在自动调整大小的 UITableView 中使用 全部带有自动布局 大多数工作都很好 但似乎加载的 UIView 使用周围
  • 如何升级Oracle 11g 11.2.0.1中的java版本[关闭]

    Closed 这个问题是无关 目前不接受答案 我的oracle数据库的java版本是1 5 0 10 如何将其升级到java 1 7 0 10 Thanks 这是不可能的 Oracle 为特定版本的 DBMS 提供了特定版本的 Java 并
  • Javascript cloneNode 不是一个函数[重复]

    这个问题在这里已经有答案了 我有几个跨度 span a span span b span span c span span d span I use getElementsByName获取跨度集合 var spans document ge
  • 修复 RegEx 中的 JSLint 擒纵机构不良警告

    我在名为的第三方 jQuery 控件中有以下代码jquery facebox js that JSLint不喜欢 这是正则表达式中的一个严重的擒纵错误 正则表达式对我来说就像 Romulan 所以我不知道如何修复错误 这是正则表达式中的句点
  • 如何使用 Devise 设置电子邮件确认?

    是否有教程解释如何从头开始设置 Devise 的注册确认电子邮件 在开发和生产中 即如果您没有设置 Action Mailer 谷歌搜索刚刚出现了一堆与此相关的单独片段 没有一篇文章能够解释得足够多 而且我不确定它们如何组合在一起 是否有分
  • 正则表达式替换除第一个和最后一个字符之外的内容

    什么是正则表达式 用于将字符串中的双引号 替换为转义反斜杠 后跟双引号 字符串的第一个和最后一个字符除外 示例 1 嵌入字符串中的双引号 Input This is a Test Expected Output This is a Test
  • WELD-001408 类型 [Validator] 的依赖关系不满足

    将项目从 Java EE 6 迁移到 Java EE 7 后 我无法部署该项目 我已经启用了 CDI beans xml 带有 bean discovery mode all 以实现向后兼容性 部署错误似乎与我的代码无关 因为它提到了一个尝
  • C# 将内部 XML 反序列化为字符串

    我有以下 XML
  • Mongodb 按索引字段搜索

    我将字段 search string 添加到我的文档中并为其建立索引 db my collection createIndex search string text Search string 包含以下内容 a ar are are are
  • 如何使用 BeautifulSoup 正确解析 UTF-8 编码的 HTML 为 Unicode 字符串? [复制]

    这个问题在这里已经有答案了 我正在运行一个 Python 程序 该程序获取 UTF 8 编码的网页 并使用 BeautifulSoup 从 HTML 中提取一些文本 但是 当我将此文本写入文件 或在控制台上打印 时 它会以意外的编码写入 示