将一个美丽的汤分成2个汤树

时间:2013-03-04 14:47:00

标签: python html beautifulsoup

有多种方法可以分割beautifulSoup parsetree获取元素列表或获取标记的字符串。 但是在拆分它时似乎没有办法保持树的完好无损。

我想在<br />上拆分以下代码段(汤)。使用字符串很简单,但我想保留结构,我想要一个parsetrees列表。

s="""<p>
foo<br />
<a href="http://...html" target="_blank">foo</a> | bar<br />
<a href="http://...html" target="_blank">foo</a> | bar<br />
<a href="http://...html" target="_blank">foo</a> | bar<br />
<a href="http://...html" target="_blank">foo</a> | bar
</p>"""
soup=BeautifulSoup(s)

显然,我可以做一个[BeautifulSoup(i) for i in str(soup).split('<br />')],但我很难看,而且我的链接太多了。

可以在soup.findAll('br')上使用soup.next和soup.previousSibling()进行迭代,但不返回分析树,而只返回它包含的所有元素。

是否有解决方案从BeautifulSoup标签中提取完整的标签子树,保留所有父级和兄弟级关系?

编辑以获得更清晰:

结果应该是一个由BeautifulSoup-Objects组成的列表,我可以通过输出[0] .a,输出[1] .text等进一步遍历分裂的汤。 在<br />上拆分汤将返回所有要进一步处理的链接列表,这就是我需要的。上面代码段中的所有链接,包含文字,属性和以下“条形码”,都是每个链接的说明。

1 个答案:

答案 0 :(得分:0)

如果您不介意更改原始树,我会在.extract()标记上使用<br />将其从树中删除:

>>> for br in soup.find_all('br'): br.extract()
... 
<br/>
<br/>
<br/>
<br/>
>>> soup
<html><body><p>
foo
<a href="http://...html" target="_blank">foo</a> | bar
<a href="http://...html" target="_blank">foo</a> | bar
<a href="http://...html" target="_blank">foo</a> | bar
<a href="http://...html" target="_blank">foo</a> | bar
</p></body></html>

这是一个完整的工作树:

>>> soup.p
<p>
foo
<a href="http://...html" target="_blank">foo</a> | bar
<a href="http://...html" target="_blank">foo</a> | bar
<a href="http://...html" target="_blank">foo</a> | bar
<a href="http://...html" target="_blank">foo</a> | bar
</p>
>>> soup.p.a
<a href="http://...html" target="_blank">foo</a>

但是你根本不需要删除这些标签来实现你想要的目标:

for link in soup.find_all('a'):
    print link['href'], ''.join(link.stripped_strings), link.next_sibling

结果:

>>> for link in soup.find_all('a'):
...     print link['href'], ''.join(link.stripped_strings), link.next_sibling
... 
http://...html foo  | bar
http://...html foo  | bar
http://...html foo  | bar
http://...html foo  | bar

无论有没有,我们首先从树中删除<br/>标签。