[英]Find next items to tag in Beautiful Soup
我想用Beautiful Soup和Python解析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": "content 1"
},
{
"content": "content 2"
}
],
"Title 2": [
{
"content": "content 3"
},
{
"content": "content 4"
},
{
"content": "content 5"
}
]
}
我已經使用nextSibling嘗試過,但是我無法檢查標簽名稱。
這是您可以實現的方法:
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']}
您可以使用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'}
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.