web-dev-qa-db-ja.com

Python:htmlをdomに解析する組み込みパッケージはありますか

SaxにはHTMLParserを、xmlにはxml.minidomを見つけました。私はかなり整形式のhtmlを持っているので、あまり強力なパーサーは必要ありません-提案はありますか?

39
Guy

BeautifulSoup をご覧ください。人気があり、HTMLの解析に優れています。

12
Bartosz

lxml をお勧めします。私はBeautifulSoupが好きですが、一般にメンテナンスの問題と、それ以降のリリースとの互換性の問題があります。 lxmlを使用して満足しています。


後で:最良の推奨事項は、lxml、html5lib、またはBeautifulSoup 3.0.8を使用することです。 BeautifulSoup 3.1.xはpython 3.xを対象としており、以前のpythonバージョン、 BeautifulSoupウェブサイトに記載されているように、

Ian Bickingには、lxmlの使用に関する good article があります。

ElementTreeはさらに推奨されますが、私は使用したことがありません。


2012-01-18:誰かが来て、python簡単に入手できるがpythonの一部ではないパッケージしたがって、非常にリテラルなStackOverflowersの場合:「xml.dom.minidomを使用できますが、他の方法よりもこれを推奨する人はいません。」

26
hughdbrown

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)
16
Joseph Sheedy

DOMオブジェクトを処理するには、Pythonで [〜#〜] htmldom [〜#〜] を使用できます。

3
delta24