首页 > 解决方案 > BeautifulSoup:抓取所有内容

问题描述

我有一个很长很长的标题列表,后面是列表:

<h2>Header1</h2>
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
</ul>
<h2>Header2</h2>
<ul>
<li>D</li>
<li>E</li>
<li>F</li>
</ul>

等等。BeautifulSoup在每个标题使用和相应标题之后获取所有列表的最紧凑方法是什么?

因此,理想情况下,结果将是一本字典,如下所示:

{
'header1': ['A','B','C'],
'header2': ['D','E','F'],
}

标签: pythonbeautifulsoup

解决方案


你可以在你得到想法后尝试这个开始和优化。

import bs4

txt = '''\
<h2>Header1</h2>
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
</ul>
<h2>Header2</h2>
<ul>
<li>D</li>
<li>E</li>
<li>F</li>
</ul>
'''

soup = bs4.BeautifulSoup(txt)

output = dict()

key = []

for _ in soup.findAll('h2'):
  key.append(_.findAll(text=True)[0])

vec = [j.findAll('li') for j in soup.findAll('ul')]

for i in range(len(vec)):
  output[key[i]] = []
  for j in vec[i]:
    output[key[i]].append(j.findAll(text=True)[0])

print(output)

输出

{'Header1': ['A', 'B', 'C'], 'Header2': ['D', 'E', 'F']}

编辑:更短更整洁的代码

from bs4 import BeautifulSoup

txt = '''\
<h2>Header1</h2>
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
</ul>
<h2>Header2</h2>
<ul>
<li>D</li>
<li>E</li>
<li>F</li>
</ul>
'''

soup = BeautifulSoup(txt, 'html.parser')
output = dict()
header = soup.find_all('h2')

for num in range(len(header)):
  temp = header[num]
  key = temp.find_all(text=True)[0]
  output[key] = []

  for item in (soup.find_all('ul')[num]).find_all('li'):
    output[key].append(item.find_all(text=True)[0])

print(output)

输出将是相同的

{'Header1': ['A', 'B', 'C'], 'Header2': ['D', 'E', 'F']}

推荐阅读