首页 > 解决方案 > 从列表和字典中抓取网页

问题描述

我一直在尝试使用 python 抓取一个网站。我想从标签中抓取数据,但我不知道如何。那里有两个列表,然后似乎有一本字典

import requests
from bs4 import BeautifulSoup

page = requests.get('https://www.daraz.pk/smartphones/nokia/?spm=a2a0e.searchlistcategory.card.2.323e5fc3B8mWd8&from'
                    '=onesearch_category_3')
# print(page.text)
soup = BeautifulSoup(page.text, 'html.parser')
# print(soup)
if "priceCurrency":
    phone = soup.find_all(type="application/ld+json")

print(phone[1])

这是我的代码,这给了我标签。我只想从中刮取特定的元素。

标签: pythonwebweb-scrapingbeautifulsoup

解决方案


使用 bs4 4.7.1,您可以使用 :contains 来定位所需的脚本标签(否则使用soup.find_all(type="application/ld+json")[1]),或者循环每个script标签然后检查if "priceCurrency" in script.text:. 您当前的设置将始终返回True

当您从具有 json 的标签中提取 .text 时,您可以使用 json 库进行解析。初始返回是一个字典。键“itemListElement”返回报价(字典)的集合。您可以循环该列表并按键访问每个内部字典中的项目。'offers'但是会返回一个字典,因此您需要再次按键访问该字典中的项目。

import requests, json
from bs4 import BeautifulSoup

page = requests.get('https://www.daraz.pk/smartphones/nokia/?spm=a2a0e.searchlistcategory.card.2.323e5fc3B8mWd8&from=onesearch_category_3')
soup = BeautifulSoup(page.text, 'html.parser')
phones = soup.select_one('[type="application/ld+json"]:contains(priceCurrency)')
data = json.loads(phones.text)

for offer in data['itemListElement']:
    print('item name : ' + offer['name'])
    print('item price : ' + offer['offers']['priceCurrency'] + str(offer['offers']['price'])) #etc

推荐阅读