在Beautiful Soup中找到要标记的下一个项目

时间:2017-08-31 13:37:06

标签: python beautifulsoup

我想解析一个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,但我无法检查标记名称。

2 个答案:

答案 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'}
    ]
}