簡體   English   中英

查找在“美麗的湯”中標記的下一項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM