【问题标题】:beautiful soup combine tags with the same name美丽的汤结合同名标签
【发布时间】:2019-04-13 07:37:09
【问题描述】:

我有多个标题标签,我想将它们组合成一个标题标签。以下是我所拥有的:(我想组合标题标签,这样当我打印汤时标签在一起并且我不希望它们变成字符串)

<title>
  <b> Title Name 1 </b>
</title> 
<title>
  Title Name 2
</title>

这是我想要的输出:

<title>
  <b> Title Name 1 </b> Title Name 2
</title> 

这是我迄今为止尝试过的: 我创建了一个新标签,然后尝试将所有标题标签添加到其中,这样我以后可以打开标题标签并留下一个标签:

<title>
  <b> Title Name 1 </b>
</title> 
<title>
  Title Name 2
</title>
<final-title>
</final-title>


for item in soup.findAll(['title', 'final-title']):
    if item.name == 'final-title':
        text = item
    if item.name == 'title':
        text.insert(len(text.contents),item)

但是,此方法无法获取适当的标题名称,因为我有很多这样的标题标签。我也尝试过使用类似的东西(Wrap multiple tags with BeautifulSoup

【问题讨论】:

  • 我的想法是将标签提取到一个列表中,并通过它们的 class/id/... 将其划分为许多子列表,然后重建文件。
  • 但在我的情况下,我按此顺序有多个标题标签,并非所有标题标签都应该组合在一起。所以示例标题 1 和 2 一起出现,但 3&4 会一起出现,而不是 1&2 的组合

标签: python xml beautifulsoup


【解决方案1】:

要使用.insert(),您需要将字符串转换为list(),但我认为将&lt;title&gt; 的列表innerHTML 与.encode_contents() 结合起来会更容易。

from bs4 import BeautifulSoup

html_raw = '''<title>
  <b> Title Name 1 </b>
</title> 
<title>Title Name 2</title>
<final-title>
</final-title>
'''
title = []
soup = BeautifulSoup(html_raw, 'html.parser')

for item in soup.findAll(['title', 'final-title']):
    if item.name == 'title':
        title.append(item.encode_contents().strip())

combinedTitle = '<title>%s</title>' % ' '.join(title)

print combinedTitle
# output
# <title><b> Title Name 1 </b> Title Name 2</title>

【讨论】:

  • 谢谢!这让我对如何前进有一个想法
  • 不客气,请考虑将此答案标记为正确。
  • 有没有办法将它们组合起来,所以当我打印汤时它会显示组合结果?
  • 据我所知,没有其他办法
猜你喜欢
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
相关资源
最近更新 更多