我正在尝试将一个html字符串插入到BeautifulSoup对象中。如果我直接插入它,bs4清理html。如果使用html字符串并从中创建一个汤,并插入我使用find
函数时遇到问题。 This post thread on SO表明插入BeautifulSoup对象可能会导致问题。我正在使用该帖子的解决方案,并在每次插入时重新创建汤。
但肯定有更好的方法将html字符串插入汤中。
编辑:我将添加一些代码作为问题的示例
from bs4 import BeautifulSoup
mainSoup = BeautifulSoup("""
<html>
<div class='first'></div>
<div class='second'></div>
</html>
""")
extraSoup = BeautifulSoup('<span class="first-content"></span>')
tag = mainSoup.find(class_='first')
tag.insert(1, extraSoup)
print mainSoup.find(class_='second')
# prints None
答案 0 :(得分:4)
最简单的方法,如果你已经有一个html字符串,就是插入另一个BeautifulSoup对象。
from bs4 import BeautifulSoup
doc = '''
<div>
test1
</div>
'''
soup = BeautifulSoup(doc, 'html.parser')
soup.div.append(BeautifulSoup('<div>insert1</div>', 'html.parser'))
print soup.prettify()
输出:
<div>
test1
<div>
insert1
</div>
</div>
这个怎么样?想法是使用BeautifulSoup生成正确的AST节点(span标记)。看起来这样可以避免&#34;无&#34;问题
import bs4
from bs4 import BeautifulSoup
mainSoup = BeautifulSoup("""
<html>
<div class='first'></div>
<div class='second'></div>
</html>
""", 'html.parser')
extraSoup = BeautifulSoup('<span class="first-content"></span>', 'html.parser')
tag = mainSoup.find(class_='first')
tag.insert(1, extraSoup.span)
print mainSoup.find(class_='second')
输出:
<div class="second"></div>
答案 1 :(得分:3)
执行此操作的最佳方法是创建新标记span
并将其插入mainSoup
。这就是.new_tag
方法的用途。
In [34]: from bs4 import BeautifulSoup
In [35]: mainSoup = BeautifulSoup("""
....: <html>
....: <div class='first'></div>
....: <div class='second'></div>
....: </html>
....: """)
In [36]: tag = mainSoup.new_tag('span')
In [37]: tag.attrs['class'] = 'first-content'
In [38]: mainSoup.insert(1, tag)
In [39]: print(mainSoup.find(class_='second'))
<div class="second"></div>