python - 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'],
}
解决方案
你可以在你得到想法后尝试这个开始和优化。
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']}
推荐阅读
- python - 遍历列以匹配 dict 值
- react-native - React Native 运行错误:无法克隆 XXX
- python - 运行 pyinstaller [pyvisa-py] 生成的可执行文件时出错
- javascript - 如何按这些数组的两个元素对数组进行排序?
- installation - 即使下载被阻止也使用 Chocolatey
- regex - 正则表达式提取谷歌数据工作室:需要将一个用管道分隔的字段分割成单独的字段
- php - 输入文本日期(2021 年 4 月 4 日)并显示时间戳
- android - Android kotlin 将 textview 片段添加到 Google Maps Marker
- ssis - 在 ssis 的上一行附加以下代码
- grails - grails 验证不会在 Spock 测试中执行类型检查吗?