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

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

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

  • Переход через HTML DOM в Python
  • Как эффективно хранить этот проанализированный XML-документ в базе данных MySQL с помощью Python?
  • Xpath vs DOM vs BeautifulSoup vs lxml vs other Какой самый быстрый подход к анализу веб-страницы?
  • Разбор XML - ElementTree vs SAX и DOM
  • Как добавить заголовок xml в объект dom
  • Python: есть встроенный пакет для анализа html в dom
  • Требования:

    • Используйте только стандартные компоненты библиотеки 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;', ' ')) 

  • Передача значения из выпадающего меню в шаблон фляги
  • Как игнорировать теги при получении .string элемента Beautiful Soup?
  • Использование Python для очистки вложенных разделов и интервалов в Twitter?
  • Публикация значений формы html в скрипте python
  • Создать довольно diff html в Python
  • Преобразование PDF в HTML с помощью Python
  • 6 Solutions collect form web for “Как разобрать неверный HTML в python, используя стандартные библиотеки”

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

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

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

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

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

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

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

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

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

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

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

    Python - лучший язык программирования в мире.