2015-11-01 2 views
3

У меня есть html-файл с некоторыми самозакрывающимися тегами, но BeautifulSoup им не нравится.BeautifulSoup - правильный способ работы с самозакрывающимися тегами

from bs4 import BeautifulSoup 
html = '<head><meta content="text/html" http-equiv="Content-Type"><meta charset="utf-8"></head>' 
doc = BeautifulSoup(html, 'html.parser') 
print doc.prettify() 

печатает

<head> 
<meta content="text/html" http-equiv="Content-Type"> 
    <meta charset="utf-8"/> 
</meta> 
</head> 

Должен ли я вручную проверить, если каждый тег самозакрывающиеся и изменить соответствующим образом, или есть лучший способ обработки этого?

ответ

3

Как вы уже знаете, вы можете указать разные парсеры, которые BeautifulSoup будет использовать внутри. И, как было отмечено в BeautifulSoupdocs:

Существует также различие между HTML анализаторами. Если вы дадите Beautiful Soup идеально оформленный HTML-документ, эти различия не будут иметь значения. Один парсер будет быстрее другого, но все они дадут вам структуру данных , которая выглядит точно так же, как и исходный HTML-документ.

Но если документ не идеально сформирован, разные синтаксические анализаторы дают разные результаты.

В данном конкретном случае, как lxml и html5lib производят два отдельных meta метки:

In [4]: doc = BeautifulSoup(html, 'lxml') 
In [5]: print(doc.prettify()) 
<html> 
<head> 
    <meta content="text/html" http-equiv="Content-Type"/> 
    <meta charset="utf-8"/> 
</head> 
</html> 

In [6]: doc = BeautifulSoup(html, 'html5lib') 
In [7]: print(doc.prettify()) 
<html> 
<head> 
    <meta content="text/html" http-equiv="Content-Type"/> 
    <meta charset="utf-8"/> 
</head> 
<body> 
</body> 
</html> 
Смежные вопросы