我想解析一个HTML文件 美丽的汤和Python喜欢
<h1>Title 1</h1>
<div class="item"><p>content 1</p></div>
<div class="item"><p>content 2</p></div>
...
<h1>Title 2</h1>
<div class="item"><p>content 3</p></div>
<div class="item"><p>content 4</p></div>
<div class="item"><p>content 5</p></div>
...
我如何将其解析为像
这样的Dictionarry{
"Title 1": [
{
"content": "content 1"
},
{
"content": "content 2"
}
],
"Title 2": [
{
"content": "content 3"
},
{
"content": "content 4"
},
{
"content": "content 5"
}
]
}
我已尝试使用nextSibling,但我无法检查标记名称。
答案 0 :(得分:1)
以下是如何实现这一目标:
soup = bs4.BeautifulSoup(html)
data = {}
row = []
title = ""
for tag in soup:
print(tag)
if tag.name == 'h1':
if title:
data[title] = row
row = []
title = tag.string
elif tag.name == 'div':
row.append(tag.string)
if title:
data[title] = row
想法是迭代标签。
如果当前标记是<h1>
,则创建新的内容列表。
否则,如果它是<div>
标记,则将其内容附加到当前内容列表。
找到新的<h1>
标记后,将当前内容列表放在最后一个标题名称下的全局数据结构(即字典)中。
可以在tag.name
中找到代码的类型。
您需要检查以查找代码是<h1>
还是<div>
。
这提供了一个与你要求的结构有点不同的结构,但我认为这是一个更好的数据结构,因为你的字典中的键总是content
,所以基本上不需要密钥和列表更好。
测试输入:
html = """<h1>Title 1</h1>
<div class="item"><p>content 1</p></div>
<div class="item"><p>content 2</p></div>
<h1>Title 2</h1>
<div class="item"><p>content 3</p></div>
<div class="item"><p>content 4</p></div>
<div class="item"><p>content 5</p></div>
"""
输出:
{'Title 1': ['content 1', 'content 2'], 'Title 2': ['content 3', 'content 4', 'content 5']}
答案 1 :(得分:0)
您可以使用next_sibling
执行此操作,并按.name
检查代码类型:
soup = BeautifulSoup(html_page, 'html.parser')
temp_tag = soup.h1
result = {temp_tag.text: []}
temp_key = temp_tag.text
while True:
temp_tag = temp_tag.next_sibling
if temp_tag.name == 'div':
buf = temp_tag.contents[0].text
result[temp_key].append({'content': buf})
elif temp_tag.name == 'h1':
temp_key = temp_tag.text
result[temp_key] = []
else:
break
print(result)
此代码的输出:
{
u'Title 1': [
{'content': u'content 1'},
{'content': u'content 2'}
],
u'Title 2': [
{'content': u'content 3'},
{'content': u'content 4'},
{'content': u'content 5'}
]
}