2010-06-19 5 views
11

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

+0

Были ли какие-либо из этих ответов, что вы искали? Если вам нужна дополнительная информация, мы, безусловно, можем помочь? – JudoWill

+0

@JudoWill: Да, я смог настроить BeautifulSoup и Tidy. К сожалению, у них не было много проблем, которые у меня были. Я закончил создание своей собственной функции, чтобы пройти цикл через DOM и исправить проблемы. Спасибо за помощь! – Joel

+0

Не могли бы вы разместить свою функцию в качестве ответа. Это проблема, с которой у меня много времени, и я всегда ищу новые решения. :) – JudoWill

ответ

14

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

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

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

+1

Будьте осторожны с производительностью, BeautifulSoup очень экспансивный. – Tarantula

+1

@Tarantula. Я согласен, BeautifulSoup довольно медленный, но это единственное, что я когда-либо видел, который может анализировать некоторые из этих сумасшедших искаженных таблиц на основе HTML. – JudoWill

+0

Это правда, JudoWill. – Tarantula

2

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

1

Я использую 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 ]) 

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

0

Это можно сделать с помощью функции 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) 
2

Вот пример очистки 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())) 

Отъезд docs для полного списка опций, которые можно передать в очистителем.

Смежные вопросы