是否有内置包将 html 解析为 dom?

Posted

技术标签:

【中文标题】是否有内置包将 html 解析为 dom?【英文标题】:Is there a built in package to parse html into dom? 【发布时间】:2011-02-16 10:45:03 【问题描述】:

我发现 htmlParser 用于 SAX,xml.minidom 用于 XML。我有一个格式很好的 HTML,所以我不需要太强大的解析器 - 有什么建议吗?

【问题讨论】:

你能接受 velotron 的回答吗,因为它是解决内置要求的? meta.stackexchange.com/questions/120568/… 【参考方案1】:

BeautifulSoup 和 lxml 很棒,但这里的答案不合适,因为问题是关于内置的。这是使用内置 minidom 模块解析 HTML 字符串的示例。使用 cPython 3.5.2 测试:

from xml.dom.minidom import parseString

html_string = """
<!DOCTYPE html>
<html><head><title>title</title></head><body><p>test</p></body></html>
"""

# extract the text value of the document's <p> tag:
doc = parseString(html_string)
paragraph = doc.getElementsByTagName("p")[0]
content = paragraph.firstChild.data

print(content)

但是,正如 Jesse Hogan 的 comment 中所指出的,这将在 mindom 无法识别的 HTML 实体上失败。这是使用 Python3 html.parser 模块的更新解决方案:

from html.parser import HTMLParser

html_string = """
<!DOCTYPE html>
<html><head><title>title</title></head><body><p>&nbsp;test</p><div>not in p</div></body></html>
"""

class Parser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.in_p = []

    def handle_starttag(self, tag, attrs):
        if (tag == 'p'):
            self.in_p.append(tag)

    def handle_endtag(self, tag):
        if (tag == 'p'):
            self.in_p.pop()

    def handle_data(self, data):
        if self.in_p:
            print("<p> data :", data)

parser = Parser()
parser.feed(html_string)

【讨论】:

这会在常见的 HTML 实体(例如 &amp;nbsp;&amp;reg;)上引发异常。【参考方案2】:

要处理 DOM 对象,您可以使用HTMLDOM for python。

【讨论】:

【参考方案3】:

我会推荐lxml。我喜欢 BeautifulSoup,但通常存在维护问题以及与更高版本的兼容性问题。我很高兴使用 lxml。


稍后:最好的建议是使用 lxml、html5lib 或 BeautifulSoup 3.0.8。 BeautifulSoup 3.1.x 适用于 python 3.x,已知在早期的 python 版本中存在问题,as noted on the BeautifulSoup website。

Ian Bicking 有一个good article 使用 lxml。

ElementTree 是进一步的推荐,但我从未使用过。


2012-01-18:有人过来并决定对我和 Bartosz 投反对票,因为我们推荐了易于获得但不属于 Python 发行版的 Python 包。所以对于高度字面化的 ***ers:“你可以使用 xml.dom.minidom,但没有人会推荐它而不是替代品。”

【讨论】:

为了它的价值,我尝试使用 ElementTree 和 xml minidom 解析一些 HTML,但它们都因脚本标签 (javascript) 中的解析错误而窒息! 我刚刚添加了一个带有 xml.dom.minidom 工作示例的答案。在某些情况下,安装外部模块是繁重的或不可能的。另外,这就是最初的问题所要求的。【参考方案4】:

看看BeautifulSoup。它很受欢迎,并且在解析 HTML 方面表现出色。

【讨论】:

如果我没记错的话,它不是内置的 不,它不是内置的。但是您可以使用 easy_install 轻松安装它,或者只需从网站下载并放入 PYTHONPATH。整个 BeautifulSoup 都包含在一个文件中,因此负担不大。 BeautifulSoup 应该解析脏 HTML 而不是“格式良好”的 HTML。 我添加了一个使用内置 xml.dom.minidom 的工作示例,它回答了原始问题。 这不是一个内置的,因此这个答案应该被视为一个有效的答案!

以上是关于是否有内置包将 html 解析为 dom?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Grunt 将 HTML 解析为 DOM

内置帮助器将 User.Identity.Name 解析为 Domain\Username

浏览器中的页面

React 将字符串解析为 html 并使用 forwardRef 将函数应用于 DOM

java代码用dom4j解析xml文件的简单操作

Android:解析 XML DOM 解析器。将子节点转换为字符串