python - 从列表和字典中抓取网页
问题描述
我一直在尝试使用 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])
这是我的代码,这给了我标签。我只想从中刮取特定的元素。
解决方案
使用 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
推荐阅读
- r - 如何将具有离散值范围的数值向量转换为因子?
- python - 函数 `matplotlib.pyplot.isinteractive` 和 `matplotlib.is_interactive` 是否相同?
- r - 如何编写一个函数来检查 grepl 中的非常规字符的字符串?
- server - 如何使用 CLI 将具有多个资源的模块添加到 WildFly
- android - 我可以在 android studio 中为我的应用添加新的文本样式吗?
- linux - 如何运行仅将标准输入、标准输出和标准错误附加到另一个正在运行的进程的进程
- python - pandas:使用 is_monotonic_increasing 遍历多个列
- javascript - 使用 Blazor WebAssembly 在 .NET Visual Studio 中找不到 JS 文件
- javascript - 如何在将数据加载到 UseEffect 中的数组后执行排序 - React Native
- python-3.x - 如何使用 python 将操纵的 numpy 数组(带注释的图像)保存为图像?