是否有内置包将 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> 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 实体(例如&nbsp;
或 &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?的主要内容,如果未能解决你的问题,请参考以下文章
内置帮助器将 User.Identity.Name 解析为 Domain\Username