<div class="col col-1-1"><h2 class="heading">Flowers</h2><ul class="icon-list"> <li class="col col-1-2 no-gutter">
<svg class="icon icon--medium">
<use xlink:href="https://"></use>
</svg>
measure 1<span class="icon-list__count">81</span> </li>
<li class="col col-1-2 no-gutter">
<svg class="icon icon--medium">
<use xlink:href="https://"></use>
</svg>
measure 2 <span class="icon-list__count">52</span> </li>
<li class="col col-1-2 no-gutter">
<svg class="icon icon--medium">
<use xlink:href="https://"></use>
</svg>
measure 3<span class="icon-list__count">29</span> </li>
</ul></div>
这是针对一种花卉的一系列措施的示例。如何抓取度量值并存储在 python 字典中?希望代码灵活,以允许在另一个寻呼机上可能只有度量 2 和 3,或度量 3 和 4(此页面上未出现新度量),或全新的度量 4 和 5。>
python 新手 - 希望得到任何建议。
答案 0 :(得分:1)
BeautifulSoup 最适合抓取静态且动态性较低的网站。 尝试使用标签中存在的唯一标识符在这个树状结构中导航。这段代码会给你一个字典,以measure n为键,value为它的值。
from bs4 import BeautifulSoup
import re
html = '<div class="col col-1-1"><h2 class="heading">Flowers</h2><ul class="icon-list"><li class="col col-1-2 no-gutter"><svg class="icon icon--medium"><use xlink:href="https://"></use></svg>measure 1<span class="icon-list__count">81</span></li><li class="col col-1-2 no-gutter"><svg class="icon icon--medium"><use xlink:href="https://"></use></svg>measure 2 <span class="icon-list__count">52</span></li><li class="col col-1-2 no-gutter"><svg class="icon icon--medium"><use xlink:href="https://"></use></svg>measure 3<span class="icon-list__count">29</span></li></ul></div>'
soup = BeautifulSoup(html,'lxml')
li_tags = soup.find_all('li') # ['measure 181', 'measure 2 52', 'measure 329']
span_tags = soup.find_all('span',class_='icon-list__count') # ['81', '52', '29']
li_list= []
for li in li_tags:
li_list.append(li.text)
measure_dict = {}
for i in range(len(li_list)):
li_list[i] = re.sub(span_tags[i].text,'',li_list[i]) #converting 'measure 181 into 'measure 1' and likewise
measure_dict[li_list[i]] = span_tags[i].text # if you want the values as integers then use int(span_tags[i].text) in this line
print(measure_dict)
#{'measure 1': '81', 'measure 2 ': '52', 'measure 3': '29'}
如果我在此处使用的标识符 class = 'icon-list__count'
出现在您访问的每个页面中,并且它还包含您要抓取的数据时,代码将是灵活的。所以你可以希望它是一样的,如果不是,你必须遍历 html 标签,通过自己识别它们来找到你想要的数据。
如果网站在您想抓取的地方使用了 Javascript(),那么最好使用 Selenium
,因为它是一个更好的动态网站抓取工具。
建议:
从长远来看,阅读模块的文档远比观看随机的 YT 视频更有帮助!
每当您想玩字符串时,请尝试使用 re
模块,它比 string