如何用Python解析包含命名ISO-8859-1实体的HTML?

2 投票
1 回答
1895 浏览
提问于 2025-04-17 04:15

我来总结一下:minidom似乎不喜欢8859这种命名实体;那该怎么解决呢?

这里有段代码可以说明我的情况:

sample = """
  <html>
    <body>
      <h1>Un ejemplo</h1>
      <p>Me llamo Juan Fulano y Hern&aacute;ndez.</p>
    </body>
  </html>
"""
sample2 = sample.replace("&aacute;", "&#225;")

import xml.dom.minidom

dom2 = xml.dom.minidom.parseString(sample2)
dom = xml.dom.minidom.parseString(sample)

简单来说:当HTML中包含像'á'这样的字符,并以命名实体的形式表示时,minidom会发出警告。

... xml.parsers.expat.ExpatError: undefined entity ...

我该怎么处理呢?我是不是应该:

  • 把命名实体换成对应的字面常量?
  • 使用其他解析器,而不是minidom?用哪个呢?
  • 通过某种方式(比如设置编码)让minidom相信这些命名实体是可以的?

可行的是说服(X)HTML的作者不使用命名实体。

1 个回答

10

xml.dom.minidom 是一个用来解析 XML 的工具,而不是解析 HTML 的工具。所以,它对 HTML 中的一些特殊符号(也叫实体)并不了解(它只知道一些在 XML 和 HTML 中都常见的符号,比如 &quot;&amp;&lt;&gt;&apos;)。

你可以试试 BeautifulSoup

撰写回答