2014-12-02 3 views
1

У меня есть HTML, который я изменяю с помощью BeautifulSoup 4 (4.3.2 в настоящее время). При преобразовании модифицированного супа в строку, все элементы br записываются как <br/>:Have BeautifulSoup output <br> вместо <br/>

>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup('<p>Paragraph containing<br>line break</p>') 
>>> soup.p 
<p>Paragraph containing<br/>line break</p> 
>>> str(soup.p) 
'<p>Paragraph containing<br/>line break</p>' 

Это нормально для HTML 5, но не обязательно для HTML 4, и для моего случая использования; Я бы хотел сделать вывод, как раньше.

Аргумент и encode, кажется, влияет только на содержание строки.

Можно ли сказать BeautifulSoup не для создания самозакрывающихся тегов? Или мне нужно написать функцию самостоятельно, чтобы ходить по супу и создать такую ​​строку?

+0

Когда я выполняю приведенные выше команды на Python 3.4.1 с помощью BeautifulSoup 4.3.2, он дает мне
и
?? : '

Абзац, содержащий
Разрыв строки

' – Scooter

+0

Это странно, и я считаю это ошибкой; элемент 'br' должен быть пустым. Я использовал Python 2.7.5 и 'lxml'. – Tobias

ответ

2

Насколько я понимаю, BeautifulSoup имеет либо теги, которые открыты, а затем закрыты или самозакрывающиеся теги. Нет такой вещи, как незамкнутый тег, как вы хотите <br> быть.

Долгое время назад, someone tried to apply a patch сделать вывод prettify()br тег правильно для HTML 4.

Самым простым решением было бы удалить закрывающей части вручную:

>>> data = '<p>Paragraph containing<br>line break</p>' 
>>> soup = BeautifulSoup(data, 'html.parser') 
>>> str(soup).replace('</br>', '') 
'<p>Paragraph containing<br>line break</p>' 

Что, на самом деле не красивая и надежное решение.

Лучший способ справиться с этим было бы создать свой собственный дерева строитель класса и контролировать путь br тега строится в handle_starttag() и handle_endtag() методов.

+0

А, я полагаю, вы имеете в виду http://effbot.org/elementtree/elementtree-treebuilder.htm#tag-ET.TreeBuilder; Я попробую это. До сих пор я ужасно терпел неудачу при попытке подкласса 'xml.etree.cElementTree.TreeBuilder':« TypeError: Ошибка при вызове оснований метакласса »для начала ... – Tobias

+0

Я отвечу« нет »в качестве ответа; собственный «класс строителя дерева» (который нужно будет объяснить более подробно), или функция будет необходима. К счастью, мне это не очень нужно срочно ;-) – Tobias

+0

@Tobias жаль, что потребовалось столько времени, чтобы ответить :) Что делать, если вы зададите отдельный вопрос о написании пользовательского «дерева строителя класса»? Может быть интересной задачей. Благодарю. – alecxe

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