网页抓取动态列表

时间:2021-01-02 11:14:36

标签: list beautifulsoup

<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 新手 - 希望得到任何建议。

1 个答案:

答案 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

中的预定义方法要好得多