Очистить HTML в Python - PullRequest
       4

Очистить HTML в Python

15 голосов
/ 19 июня 2010

Я собираю контент из нескольких внешних источников и обнаруживаю, что некоторые из них содержат ошибки в своем HTML / DOM.Хорошим примером будет отсутствие в HTML закрывающих тегов или неверно сформированных атрибутов тегов.Есть ли способ исправить ошибки в Python или какие-либо сторонние модули, которые я мог установить?

Ответы [ 5 ]

16 голосов
/ 19 июня 2010

Я бы предложил Beautifulsoup . У него есть замечательный парсер, который может изящно работать с искаженными тегами. Прочитав все дерево, вы можете просто вывести результат.

from BeautifulSoup import BeautifulSoup
tree = BeautifulSoup(bad_html)
good_html = tree.prettify()

Я использовал это много раз, и это творит чудеса. Если вы просто извлекаете данные из bad-html, то BeautifulSoup действительно блестяще справляется с извлечением данных.

6 голосов
/ 22 сентября 2017

Вот пример очистки HTML с использованием модуля lxml.html.clean.Cleaner :

import sys

from lxml.html.clean import Cleaner


def sanitize(dirty_html):
    cleaner = Cleaner(page_structure=True,
                  meta=True,
                  embedded=True,
                  links=True,
                  style=True,
                  processing_instructions=True,
                  inline_style=True,
                  scripts=True,
                  javascript=True,
                  comments=True,
                  frames=True,
                  forms=True,
                  annoying_tags=True,
                  remove_unknown_tags=True,
                  safe_attrs_only=True,
                  safe_attrs=frozenset(['src','color', 'href', 'title', 'class', 'name', 'id']),
                  remove_tags=('span', 'font', 'div')
                  )

    return cleaner.clean_html(dirty_html)


if __name__ == '__main__':

    with open(sys.argv[1]) as fin:

        print(sanitize(fin.read()))

Проверьте документы для получения полного списка параметров, которые вы можете передать в Cleaner.

3 голосов
/ 26 июня 2011

Я использую lxml для преобразования HTML в правильный (правильно сформированный) XML:

from lxml import etree
tree   = etree.HTML(input_text.replace('\r', ''))
output_text = '\n'.join([ etree.tostring(stree, pretty_print=True, method="xml") 
                          for stree in tree ])

... и много удаляем 'опасных элементов' посередине ....

3 голосов
/ 19 июня 2010

Существуют привязки к Python для HTML Tidy Library Project , но автоматическая очистка поврежденного HTML - сложная задача Это не так сильно отличается от попытки автоматического исправления исходного кода - просто слишком много возможностей. Вам все еще нужно будет просмотреть вывод и почти наверняка внести дополнительные исправления вручную.

1 голос
/ 22 марта 2015

Это можно сделать с помощью функции tidy_document в модуле tidylib.

import tidylib
html = '<html>...</html>'
inputEncoding = 'utf8'
options = {
    str("output-xhtml"): True, #"output-xml" : True
    str("quiet"): True,
    str("show-errors"): 0,
    str("force-output"): True,
    str("numeric-entities"): True,
    str("show-warnings"): False,
    str("input-encoding"): inputEncoding,
    str("output-encoding"): "utf8",
    str("indent"): False,
    str("tidy-mark"): False,
    str("wrap"): 0
    };
document, errors = tidylib.tidy_document(html, options=options)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...