我有一个类似于以下内容的html文件:
<h2>section 1</h2>
<p>para 1</p>
<p>para 2</p>
<p>para 3</p>
<h2>section 2</h2>
<p>para 1</p>
<p>para 2</p>
<p>para 3</p>
<h2>section 3</h2>
<p>para 1</p>
<p>para 2</p>
<p>para 3</p>
我想把它们写成python字典:{'section1':'...', 'section2':'...', 'section3':'...'}
,当然我可以设置一个current_section
变量并使用while循环,但是有一个模块用于此目的吗?
我已经查看了BeautifulSoup,但没有在那里找到捷径。
谢谢!
答案 0 :(得分:1)
据我所知,soup.group_by_header()
没有任何内容,但对于你所描述的输入,你想要的东西在任何情况下都是相当简单的:
>>> from bs4 import BeautifulSoup
>>> html = """
... <h2>section 1</h2>
... <p>para 1</p>
... <!-- etc. -->
... """
>>> soup = BeautifulSoup(html)
>>> sections = {}
>>> for header in soup("h2"):
... paras = []
... for sibling in header.find_next_siblings(text=False):
... if sibling.name == "h2":
... break
... paras.append(sibling.string)
... sections[header.string] = paras
...
>>> sections
{u'section 1': [u'para 1', u'para 2', u'para 3'],
u'section 2': [u'para 1', u'para 2', u'para 3'],
u'section 3': [u'para 1', u'para 2', u'para 3']}
>>>
由于某些原因,这种方法是否有问题,或者您只是想知道是否有一些聪明的BeautifulSoup方法可以解决这些问题(并且公平地说,还有一些方法)?
答案 1 :(得分:0)
我认为你想要string
内置的split
方法。如果您在html_string
中找到的文字可以
sections = html_string.split('<h2>') #this deletes the opening h2 tag
for section in sections:
section = '<h2>' + section #replace the opening h2 tag
#code to parse each section goes here
这应该比使用while
循环更清晰。