Python: есть ли встроенный пакет для разбора HTML в дом - PullRequest
39 голосов
/ 06 мая 2010

Я нашел HTMLParser для sax и xml.minidom для xml. У меня довольно хорошо сформированный HTML, поэтому мне не нужен слишком сильный парсер - какие-либо предложения?

Ответы [ 4 ]

26 голосов
/ 06 мая 2010

Я бы порекомендовал lxml . Мне нравится BeautifulSoup, но, как правило, есть проблемы с обслуживанием и проблемы совместимости с более поздними выпусками. Я был счастлив, используя lxml.


Позже: лучшие рекомендации - использовать lxml, html5lib или BeautifulSoup 3.0.8. BeautifulSoup 3.1.x предназначен для Python 3.x и, как известно, имеет проблемы с более ранними версиями Python, , как отмечено на веб-сайте BeautifulSoup .

У Яна Бикинга есть хорошая статья об использовании lxml.

ElementTree - еще одна рекомендация, но я никогда не использовал ее.


2012-01-18: кто-то пришел и решил понизить голосование за меня и Бартоша, потому что мы порекомендовали пакеты python, которые легко получить, но не являются частью дистрибутива python. Так что для очень буквальных StackOverflowers: «Вы можете использовать xml.dom.minidom, но никто не будет рекомендовать это по сравнению с альтернативами».

15 голосов
/ 22 ноября 2016

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)

Однако, как указано в комментарии Джесси Хогана , это не удастся для объектов HTML, не распознаваемых mindom. Вот обновленное решение с использованием модуля 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)
12 голосов
/ 06 мая 2010

Взгляните на BeautifulSoup .Он популярен и отлично разбирает HTML.

3 голосов
/ 19 апреля 2014

Для обработки объектов DOM вы можете использовать HTMLDOM для python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...