Я понимаю, что это старый вопрос, но я пришел сюда в поисках информации, которую не нашел ни в одном другом месте. Я пытался что-то почистить с BeautifulSoup, но он задыхался от какого-то короткого HTML. Парсер html по умолчанию явно менее свободен, чем некоторые другие, которые доступны. Одним из часто предпочитаемых синтаксических анализаторов является lxml, который, как я считаю, производит такой же синтаксический анализ, как и ожидалось для браузеров. BeautifulSoup позволяет вам указать lxml в качестве исходного синтаксического анализатора, но его использование требует немного работы.
Во-первых, вам нужен html5lib И вы также должны установить lxml. Хотя html5lib готов использовать lxml (и некоторые другие библиотеки), они не упакованы вместе. [для пользователей Windows, хотя мне не нравится возиться с зависимостями Win в той степени, в которой я обычно получаю библиотеки, делая копии в том же каталоге, что и мой проект, я настоятельно рекомендую использовать для этого pip; довольно безболезненно; Я думаю, вам нужен доступ администратора.]
Тогда вам нужно написать что-то вроде этого:
import urllib2
from bs4 import BeautifulSoup
import html5lib
from html5lib import sanitizer
from html5lib import treebuilders
from lxml import etree
url = 'http://...'
content = urllib2.urlopen(url)
parser = html5lib.HTMLParser(tokenizer=sanitizer.HTMLSanitizer,
tree=treebuilders.getTreeBuilder("lxml"),
namespaceHTMLElements=False)
htmlData = parser.parse(content)
htmlStr = etree.tostring(htmlData)
soup = BeautifulSoup(htmlStr, "lxml")
Тогда наслаждайся своим прекрасным супом!
Обратите внимание на опцию namespaceHTMLElements = false в анализаторе. Это важно, потому что lxml предназначен для XML, а не только для HTML. По этой причине он помечает все предоставляемые теги как принадлежащие пространству имен HTML. Теги будут выглядеть (например)
<html:li>
и BeautifulSoup не будут работать хорошо.