有内置的包可以将HTML解析成DOM吗?

50 投票
5 回答
56416 浏览
提问于 2025-04-15 22:25

我发现了 HTMLParser 可以用来处理SAX,还有 xml.minidom 可以用来处理XML。我这边的HTML格式还不错,所以不需要太复杂的解析器,有什么推荐的吗?

5 个回答

22

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在评论中提到的,这个方法在处理一些minidom无法识别的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)
31

我推荐使用 lxml。我喜欢BeautifulSoup,但它在维护上有些问题,而且在后来的版本中兼容性也不太好。使用lxml让我很满意。


后来:最好的推荐是使用lxml、html5lib,或者BeautifulSoup 3.0.8。BeautifulSoup 3.1.x是为python 3.x设计的,已知在早期的python版本中会有问题,正如BeautifulSoup网站上所提到的

Ian Bicking写了一篇关于使用lxml的不错的文章

ElementTree也是一个推荐,但我自己从来没有用过。


2012-01-18:有人来给我和Bartosz点了反对票,因为我们推荐了一些容易获取但不属于python发行版的包。所以对于那些非常字面理解的StackOverflow用户来说:“你可以使用xml.dom.minidom,但没有人会推荐它比其他选择更好。”

16

看看这个叫做 BeautifulSoup 的工具。它很受欢迎,而且在解析HTML方面表现得非常好。

撰写回答