关闭和打开标签之间的漂亮汤包

时间:2018-10-25 19:27:53

标签: python xml beautifulsoup

BeautifulSoup和Python的新功能。我想知道是否有一种方法可以在结束标签之后投放标签,并在开始标签之前关闭标签。还是应该修改我的树?如您所见,p标签被视为标题的子级,也被视为父级。

这是我的示例代码:

<title> 
  <p> Title Name 1 </p>
</title>
<p> Paragraph 1 </p>
<p> Paragraph 2 </p>
<p> Paragraph 3 </p>
<title> 
  <p> Title Name 2 </p>
</title>

这就是我想要的...

<title> 
  <p> Title Name 1 </p>
</title>
**<new_tag>**
<p> Paragraph 1 </p>
<p> Paragraph 2 </p>
<p> Paragraph 3 </p>
**</new_tag>**
<title> 
  <p> Title Name 2 </p>
</title>

每次我尝试做soup.find_all('p)或soup.findChildren('p)时,我都没有得到想要的p标签,或者我抓住了它们,因此new_tag被添加到每个p标签中。 它在下面创建输出。有没有一种方法可以清理new_tag并使它看起来像上面的理想输出。

<title> 
  <new_tag>
    <p> Title Name 1 </p>
   <new_tag>
</title>
<new_tag>
<p> Paragraph 1 </p>
</new_tag>
<new_tag>
<p> Paragraph 2 </p>
</new_tag>
<new_tag>
<p> Paragraph 3 </p>
</new_tag>
<title> 
<new_tag>
  <p> Title Name 2 </p>
</new_tag>
</title>

1 个答案:

答案 0 :(得分:1)

以问题中的示例为例,似乎可以提取所有标签并将'new_tag'插入适当的位置:

p_tags = soup.find_all('p')[1:-1:]
new_tag = soup.new_tag('new_tag')
titles = soup.find_all('title')

titles[0].insert_after(new_tag)

for tag in p_tags:
    new_tag.append(tag)

new_tag.insert_after(titles[1])

结果:

>>> print(soup.prettify())
<title>
 <p>
  Title Name 1
 </p>
</title>
<new_tag>
 <p>
  Paragraph 1
 </p>
 <p>
  Paragraph 2
 </p>
 <p>
  Paragraph 3
 </p>
</new_tag>
<title>
 <p>
  Title Name 2
 </p>
</title>

似乎符合期望的结果。