Как разобрать неверный 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(' ', ' '))
Ответы
Ответ 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-код, чтобы он запускался. Это значительно больше усилий, чтобы заставить их работать, и если ваша среда ограничена или ваша целевая аудитория не желает этого, избегайте их.