Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按标记顺序分组html内容_Python_Html Parsing_Beautifulsoup - Fatal编程技术网

Python 按标记顺序分组html内容

Python 按标记顺序分组html内容,python,html-parsing,beautifulsoup,Python,Html Parsing,Beautifulsoup,我有一个类似于以下内容的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&

我有一个类似于以下内容的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>
第1节
第1款

第2段

第3段

第二节 第1款

第2段

第3段

第三节 第1款

第2段

第3段

我想把它们放到python字典中:
{'section1':'…','section2':','section3':'…'}
,当然我可以设置一个
current_section
变量并使用while循环,但是有用于此目的的模块吗? 我已经离开了BeautifulSoup,但在那里找不到捷径


谢谢

我想您需要
string
内置的
split
方法。如果你得到的文本在
html\u字符串中,你可以这样做

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
sections=html_string.split(“”)#这将删除开头的h2标记
对于分段:
节=''+节#替换开口h2标签
#解析每个部分的代码如下所示

这应该比使用
while
循环更干净。

据我所知,在
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']}
>>> 
>>来自bs4导入组
>>>html=”“”
…第1节
第1段

... ... """ >>>soup=BeautifulSoup(html) >>>节={} >>>对于汤中的标题(“h2”): ... 第[]段 ... 对于标头中的同级。查找\u下一个\u同级(text=False): ... 如果sibling.name==“h2”: ... 打破 ... 段落追加(同级字符串) ... 节[header.string]=第 ... >>>部分 {u'section 1':[u'para 1',u'para 2',u'para 3'], u‘第2节’:[u‘第1段’、u‘第2段’、u‘第3段’], u'第3节':[u'第1段'、u'第2段'、u'第3段]] >>>

这种方法有问题吗?或者你只是想知道是否有一些聪明的BeautifulSoup方法适合(公平地说,其中有一些)?

这是一个坏主意-使用HTML解析器是更好的选择。这可以将整个HTML页面分成多个组,但不会将文本提取到词典中。谢谢,这看起来真不错。但如果有,如你所说,一些聪明美丽的方法,请分享这些也,我将非常感激!