按分支和祖先对相同 class 中的元素进行排序
Sorting elements in the same class by their branch and ancestors
我得到了以下 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],
姓名 B:[姓名 BAA, 姓名 BAB, 姓名 BBA, 姓名 BBB]}
我正在使用 beautifulSoup select 函数,但不能 link 在 "three" 后代 class 的名称之间 returns 与他们祖先的名字在 class "one" 中。
实际上我的代码中的结果是:
wordOnesText = [姓名A, 姓名B]
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')
你能帮我link这两个列表在字典里吗?
你可以试试这个脚本。它利用 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']}
试试下面的代码。
itemdict={}
soup=BeautifulSoup(data,'lxml')
for item in soup.select('.one'):
itemlist = []
name=item.contents[0].strip()
for child in item.select('.three'):
itemlist.append(child.text)
itemdict[name]=itemlist
print(itemdict)
这应该打印。
{'nameA': ['nameAAA', 'nameAAB', 'nameABA', 'nameABB'], 'nameB': ['nameBAA', 'nameBAB', 'nameBBA', 'nameBBB']}
我得到了以下 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], 姓名 B:[姓名 BAA, 姓名 BAB, 姓名 BBA, 姓名 BBB]}
我正在使用 beautifulSoup select 函数,但不能 link 在 "three" 后代 class 的名称之间 returns 与他们祖先的名字在 class "one" 中。 实际上我的代码中的结果是: wordOnesText = [姓名A, 姓名B] 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')
你能帮我link这两个列表在字典里吗?
你可以试试这个脚本。它利用 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']}
试试下面的代码。
itemdict={}
soup=BeautifulSoup(data,'lxml')
for item in soup.select('.one'):
itemlist = []
name=item.contents[0].strip()
for child in item.select('.three'):
itemlist.append(child.text)
itemdict[name]=itemlist
print(itemdict)
这应该打印。
{'nameA': ['nameAAA', 'nameAAB', 'nameABA', 'nameABB'], 'nameB': ['nameBAA', 'nameBAB', 'nameBBA', 'nameBBB']}