【问题标题】:Have BeautifulSoup output <br> instead of <br/>有 BeautifulSoup 输出 <br> 而不是 <br/>
【发布时间】:2015-01-30 11:20:35
【问题描述】:

我有一些使用 BeautifulSoup 4(当前为 4.3.2)修改的 HTML。将修改后的soup转换为字符串时,所有br元素都写成&lt;br/&gt;

>>> 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 和我的用例来说不一定;我想像以前一样产生输出。

prettifyencode 方法的 formatter 参数似乎只影响字符串内容。

是否可以告诉 BeautifulSoup 生成自闭合标签? 还是我需要自己编写一个函数来走汤并创建这样的字符串?

【问题讨论】:

  • 当我在 Python 3.4.1 上使用 BeautifulSoup 4.3.2 执行上述命令时,它给了我
    和 ?? : '

    包含
    换行符的段落

    '
  • 这很奇怪,我认为这是一个错误; br 元素应该为空。我使用了 Python 2.7.5 和 lxml

标签: python html beautifulsoup


【解决方案1】:

据我了解,BeautifulSoup 具有打开然后关闭的标签或自关闭标签。没有像你想要的 &lt;br&gt; 这样的非封闭标签。

很久以前,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()方法中的构造方式。

【讨论】:

  • 啊,我想你的意思是effbot.org/elementtree/…;我会试试这个。到目前为止,我在尝试继承 xml.etree.cElementTree.TreeBuilder 时惨遭失败:“TypeError: Error when calling the metaclass bases”开始......
  • 我会选择“否”作为答案;需要一个自己的“树构建器类”(需要更详细地解释)或功能。幸运的是,我似乎并不迫切需要它;-)
  • @Tobias 抱歉花了这么长时间才回答 :) 如果您提出一个关于编写自定义“树构建器类”的单独问题怎么办?可能是一个有趣的挑战。谢谢。
猜你喜欢
  • 2012-12-21
  • 2010-12-12
  • 2013-08-25
  • 2010-12-29
  • 1970-01-01
  • 2020-04-22
  • 2014-01-24
  • 1970-01-01
相关资源
最近更新 更多