Как проанализировать уродливый HTML в Python, пользуясь стандартными библиотеками

Существуют так многие HTML и xml библиотеки, встроенные в Python, что трудно полагать, что нет никакой поддержки реального парсинга HTML.

Я нашел много больших сторонних библиотек для этой задачи, но этот вопрос о библиотеке стандарта Python.

Требования:

  • Используйте только компоненты библиотеки стандарта Python (любой 2.x версия)
  • Поддержка DOM
  • Обработайте объекты HTML ( )
  • Обработайте частичные документы (как: Hello, World!)

Бонусные очки:

  • Поддержка XPath
  • Обработайте открытые/уродливые теги. (does anyone here know

Вот мое 90%-е решение, согласно просьбе. Это работает на ограниченный набор HTML, который я попробовал, но как все могут явно видеть, это не точно устойчиво. Так как я сделал это, уставившись на документы в течение 15 минут и одну строку кода, я думал, что смогу консультироваться с stackoverflow сообществом для подобного, но лучшего решения...

from xml.etree.ElementTree import fromstring
DOM = fromstring("%s" % html.replace(' ', ' '))

37
задан bukzor 21 April 2010 в 04:47
поделиться

5 ответов

Надежный синтаксический анализ HTML - относительно современная разработка (как ни странно это может показаться). В итоге в стандартной библиотеке точно ничего нет. HTMLParser может показаться способом обработки HTML, но это не так - он не работает во многих очень распространенных HTML, и хотя вы можете обойти эти ошибки, всегда будет другой случай, о котором вы не думали (если вам действительно удается справиться с каждой ошибкой, вы в основном воссоздаете BeautifulSoup).

На самом деле существует только 3 разумных способа синтаксического анализа HTML (как он находится в Интернете): lxml.html , BeautifulSoup и html5lib . lxml на сегодняшний день является самым быстрым, но его может быть немного сложно установить (и невозможно в такой среде, как App Engine). html5lib основан на том, как HTML 5 определяет синтаксический анализ; хотя на практике он похож на два других, возможно, он более «правильный» в том, как он анализирует сломанный HTML (все они анализируют довольно хороший HTML одинаково). Все они неплохо справляются с синтаксическим анализом сломанного HTML. BeautifulSoup может быть удобным, хотя я считаю его API излишне необычным.

44
ответ дан 27 November 2019 в 04:50
поделиться

Возьмите исходный код BeautifulSoup и скопируйте его в свой скрипт ;-) Я шучу ... все, что вы могли бы написать, что могло бы сделать эту работу, было бы больше или меньше дублировать функциональность, которая уже существует в подобных библиотеках.

Если это действительно не сработает, я должен спросить, почему так важно, чтобы вы использовали только стандартные библиотечные компоненты?

5
ответ дан 27 November 2019 в 04:50
поделиться

не соответствует вашим требованиям только к std, но beautifulsoup хорош

1
ответ дан 27 November 2019 в 04:50
поделиться

Я не могу вспомнить ни одного популярного языка с хорошей, надежной, эвристической библиотекой синтаксического анализа HTML в его stdlib. У Python, конечно же, его нет, и я думаю, вы это знаете.

Почему требуется модуль stdlib? В большинстве случаев, когда я слышу, что люди выдвигают это требование, они поступают глупо. Для большинства основных задач вам понадобится сторонний модуль или потратить целую работу на его повторное внедрение. Введение зависимости - это хорошая вещь, поскольку эту работу вам не нужно делать.

Итак, вам нужен lxml.html . Отправьте lxml вместе со своим кодом, если это проблема, и в этот момент он становится функционально эквивалентным написанию его самостоятельно, за исключением сложности, ошибок и ремонтопригодности.

1
ответ дан 27 November 2019 в 04:50
поделиться

Вы можете изменить свои требования или дублировать всю работу, проделанную разработчиками сторонних модулей.

Красивый суп состоит из одного файла python с примерно 2000 строк кода, если это слишком большая зависимость, тогда продолжайте и напишите свой собственный, он не будет работать так же хорошо и, вероятно, не будет целым намного меньше.

4
ответ дан 27 November 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: