Python:是否有一个内置的包来解析html到dom

Guy*_*Guy 39 html python parsing dom

我找到了用于sax的HTMLParser和用于xml的xml.minidom.我有一个非常好的html所以我不需要太强大的解析器 - 任何建议?

hug*_*own 26

我会推荐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包很容易获得,但不是python发行版的一部分.因此,对于高度文字的StackOverflowers:"你可以使用xml.dom.minidom,但没有人会推荐这个替代品."

  • 不管怎样,我尝试使用 ElementTree 和 xml minidom 来解析一些 HTML,但它们都因脚本标签(javascript)中的解析错误而窒息! (2认同)

Jos*_*edy 17

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)
Run Code Online (Sandbox Code Playgroud)

但是,正如Jesse Hogan的评论所指出的那样,对于未被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)
Run Code Online (Sandbox Code Playgroud)


Bar*_*osz 12

看看BeautifulSoup吧.它在解析HTML时很受欢迎.

  • 如果我没弄错的话,它不是内置的 (9认同)
  • 不,它不是内置的.但您可以使用easy_install轻松安装它,或者只是从网站下载并放入PYTHONPATH.整个BeautifulSoup包含在一个文件中,所以它不是一个负担. (4认同)