使用Beautifulsoup从html获取datatestid和属性

2024-06-16 11:48:26 发布

您现在位置:Python中文网/ 问答频道 /正文

这里是网络开发新手。所以请友善点

我发现这个标签对我来说真的很奇怪

考虑以下HTML文档:

import urllib3
from bs4 import BeautifulSoup

url = 'https://www.carrefourkuwait.com/mafkwt/en/Frozen-Food/c/FKWT6000000?currentPage=1&filter=&nextPageOffset=0&pageSize=60&sortBy=relevance'

req = urllib3.PoolManager()
res = req.request('GET', url)
soup = BeautifulSoup(res.data, 'html.parser')
soup

我想知道产品的名称和价格。但是使用soup.findAll('div', {'data-testid': 'product_name'})不起作用

这里的问题是,产品名称和价格是<a\>标记中链接的属性。即使有soup.findAll('a')我也一无所获:[]

enter image description here 你能帮个忙吗

我也无法滚动页面。我写了这段代码,但它不起作用(继续给我第=1页的副本)

tag = 'Bakery/c/FKWT1610000' 

scrap_all = pd.DataFrame()

for x in tqdm(range(1,10)):
    scrap_page = pd.DataFrame()
    r = requests.get(parent_url+tag+'?currentPage='+str(x)+'&filter=&nextPageOffset=0&pageSize=200&sortBy=relevance',
                     headers = {'User-Agent':'Mozilla/5.0'})
    
    data = json.loads(re.search(r'(\{"prop.*\})', r.text).group(1))
    data = data['props']['initialState']['search']['products']
    scrap_page['item_desc'] = [i['name'] for i in data]
    scrap_page['item_price'] = [i['originalPrice'] for i in data]

    scrap_carrefour = pd.concat([scrap_carrefour,scrap_page])

Tags: inimporturlfordatapagefilterpd
1条回答
网友
1楼 · 发布于 2024-06-16 11:48:26

数据是从脚本标记中动态提取的。由于javascript不会与请求一起运行,因此此信息会保留在脚本标记中,并且不会出现在您正在查看的位置

您可以将包含相关信息的字符串正则化,使用json进行解析,并创建一个dict,如下所示:

import requests, re, json

r = requests.get('https://www.carrefourkuwait.com/mafkwt/en/Frozen-Food/c/FKWT6000000?currentPage=1&filter=&nextPageOffset=0&pageSize=60&sortBy=relevance',
                 headers = {'User-Agent':'Mozilla/5.0'})
data = json.loads(re.search(r'(\{"prop.*\})', r.text).group(1))
info = {i['name']:str(i['originalPrice'])+ ' '+ i['currency'] for i in data['props']['initialState']['search']['products']}

相关问题 更多 >