python - 按分支和祖先对同一类中的元素进行排序
问题描述
我有以下 html(所有元素 name*、name** 和 name*** 都是未知的):
<div class="one">nameA</a>
<div class="two">nameAA</a>
<a class="three">nameAAA</a>
<a class="three">nameAAB</a>
</div>
<div class="two">nameAB</a>
<a class="three">nameABA</a>
<a class="three">nameABB</a>
</div>
</div>
<div class="one">nameB</a>
<div class="two">nameBA</a>
<a class="three">nameBAA</a>
<a class="three">nameBAB</a>
</div>
<div class="two">nameBB</a>
<a class="three">nameBBA</a>
<a class="three">nameBBB</a>
</div>
</div>
并试图制作这本字典:
名称= {nameA:[nameAAA,nameAAB,nameABA,nameABB],nameB:[nameBAA,nameBAB,nameBBA,nameBBB]}
我正在使用 beautifulSoup 选择函数,但无法将它返回的“三”后代类中的名称与其在“一”类中的祖先的名称联系起来。实际上我的代码中的结果是: wordOnesText = [nameA, nameB] wordThreesText = [nameAAA, nameAAB, nameABA, nameABB, nameBAA, nameBAB, nameBBA, nameBBB]
res = requests.get('address')
soup = bs4.BeautifulSoup(res.text, features='html.parser')
wordOnes = soup.select('.one')
wordThrees = soup.select('.three') or soup.select('.one > .two > .three')
你能帮我把这两个列表链接到字典里吗?
解决方案
你可以试试这个脚本。它利用itertools.groupby
( doc ) 将元素分组为键、值:
data = '''<a class="one">nameA</a>
<a class="two">nameAA</a>
<a class="three">nameAAA</a>
<a class="three">nameAAB</a>
<a class="two">nameAB</a>
<a class="three">nameABA</a>
<a class="three">nameABB</a>
<a class="one">nameB</a>
<a class="two">nameBA</a>
<a class="three">nameBAA</a>
<a class="three">nameBAB</a>
<a class="two">nameBB</a>
<a class="three">nameBBA</a>
<a class="three">nameBBB</a>'''
from bs4 import BeautifulSoup
from itertools import groupby
soup = BeautifulSoup(data, 'html.parser')
def get_key_values(soup):
current_key = None
for v, g in groupby(soup.select('.one, .three'), lambda k: 'one' in k['class']):
if v is True:
current_key = next(g).text
else:
yield current_key, [i.text for i in g]
out = dict(get_key_values(soup))
from pprint import pprint
pprint(out)
印刷:
{'nameA': ['nameAAA', 'nameAAB', 'nameABA', 'nameABB'],
'nameB': ['nameBAA', 'nameBAB', 'nameBBA', 'nameBBB']}
推荐阅读
- javascript - 烧瓶熊猫到制表表都搞砸了
- python - 在 Python 中以不同字符串开头和结尾的字符串中查找字符串
- assembly - 引导加载程序。将字符串写入屏幕
- java - 从 CSV 文件解析不同类型的数据格式
- java - 使用hibernate管理多对多关系
- python - GridSearchCV 拟合
- angular - Angular *ngIf 内存使用情况
- sql - 如果满足另一个表中的条件,则显示表中的行
- amazon-web-services - AWS ElasticBeanstalk 从 Gitlab 注册表中提取 Docker 映像
- php - PHP json_decode 使用 Symfony 返回 null