python 是否有一个内置的包来将html解析为dom?

e4eetjau  于 2023-05-16  发布在  Python
关注(0)|答案(5)|浏览(114)

我找到了用于SAX的HTMLParser和用于XML的xml.minidom。我有一个非常好的HTML格式,所以我不需要一个太强大的解析器-任何建议?

e5nszbig

e5nszbig1#

我推荐lxml。我喜欢BeautifulSoup,但一般都有维护问题,并且与后来的版本存在兼容性问题。我很高兴使用lxml。
稍后:最好的建议是使用lxml、html5 lib或BeautifulSoup 3.0.8。BeautifulSoup 3.1.x是为python 3.x设计的,并且已知早期python版本as noted on the BeautifulSoup website存在问题。
Ian Bicking有一篇关于使用lxml的good article
ElementTree是一个进一步的建议,但我从来没有使用过它。
2012-01-18:有人来了,决定否决我和Bartosz,因为我们推荐的Python包很容易获得,但不是Python发行版的一部分。所以对于高度文字化的StackOverflowers:您可以使用xml.dom.minidom,但没有人会推荐使用它而不是其他替代方案。

pcww981p

pcww981p2#

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的评论所指出的,这将在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)
ifmq2ha2

ifmq2ha23#

看看BeautifulSoup。它在解析HTML方面很受欢迎并且非常出色。

bybem2ql

bybem2ql4#

要处理DOM对象,可以使用python的HTMLDOM

6fe3ivhb

6fe3ivhb5#

有一个技巧只使用python3内置函数(3.4+)
使用html.unescape解码所有html5实体。然后使用html.escape<>"&编码回xml解析器的实体,将其他实体作为unicode字符留在字符串中。

#! /usr/bin/python3
import re
import xml.dom.minidom
from html import escape, unescape

def minidom_parseHtml(text: str):
     "parse html text with non-xml html-entities as minidom"
     textXML = re.sub("\\&\\w+\\;", lambda x: escape(unescape(x.group(0))), text)
     return xml.dom.minidom.parseString(textXML)

相关问题