Подтвердить что ты не робот

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

Существует так много html и xml-библиотек, встроенных в python, что трудно поверить, что нет поддержки для разбора HTML в реальном времени.

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

Требования:

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

Бонусные баллы:

  • Поддержка XPATH
  • Обрабатывать закрытые/искаженные теги. (<big>does anyone here know <html ???

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

from xml.etree.ElementTree import fromstring
DOM = fromstring("<html>%s</html>" % html.replace('&nbsp;', '&#160;'))
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

Как уже говорилось, в настоящее время нет удовлетворительного решения только со стандартным листом. Я столкнулся с той же проблемой, что и вы, когда я пытался запустить одну из моих программ в устаревшей среде размещения без возможности установки собственных расширений и только python2.6. Решение:

Захватите этот файл и последний стабильный BeautifulSoup версия серии 3er (3.2.1 на данный момент). Из tar файла там выберите только BeautifulSoup.py, это единственный, который вам действительно нужно отправить с кодом. Таким образом, у вас есть эти два файла на вашем пути, все, что вам нужно сделать, чтобы получить случайный объект etree из некоторой строки HTML, например, вы получите его из lxml, это:

from StringIO import StringIO
import ElementSoup

tree = ElementSoup.parse(StringIO(input_str))

lxml сам и html5lib оба требуют от вас, чтобы скомпилировать некоторый C-код, чтобы он запускался. Это значительно больше усилий, чтобы заставить их работать, и если ваша среда ограничена или ваша целевая аудитория не желает этого, избегайте их.