Python网页抓取中如何提取data-id对应的内容?
问题描述
需要从网站提取产品名称、产品编号、价格和规格,但没有可用的class来解析HTML结构,只能依赖data-type、data-id属性以及内部的tr、td标签。目前搜索data-id时仅能获取标签本身,无法提取内部内容,尝试多种方法均无效,现有Python代码如下:
from cgitb import text from pickle import TRUE from bs4 import BeautifulSoup import requests import urllib import pandas as pd import json url = "https://www.albelli.nl/prijsoverzicht" result = requests.get(url) doc = BeautifulSoup(result.text, "html.parser") WholeDoc = doc.find('div', 'arc3-container arc3-margin--bottom-none arc3-margin--top-none price-overview--content') for letstry in WholeDoc.find_all('div', attrs={'data-type' : 'Photobook'}): for item in letstry.find_all('tbody'): for moop in item.find_all('tr', attrs=('data-id')): print(moop)
错误原因
你使用attrs=('data-id')的写法不符合BeautifulSoup的语法要求,attrs参数需要传入字典格式来指定属性条件,或者直接用{'data-id': True}匹配所有包含data-id属性的tr标签。元组格式的写法无法正确识别属性规则,导致只能拿到标签对象,无法提取内部的产品信息。
修正后的代码
from bs4 import BeautifulSoup import requests import pandas as pd url = "https://www.albelli.nl/prijsoverzicht" result = requests.get(url) doc = BeautifulSoup(result.text, "html.parser") # 定位目标内容容器 WholeDoc = doc.find('div', 'arc3-container arc3-margin--bottom-none arc3-margin--top-none price-overview--content') # 遍历Photobook类别的所有区块 for photobook_section in WholeDoc.find_all('div', attrs={'data-type': 'Photobook'}): # 处理每个tbody下的产品行 for tbody in photobook_section.find_all('tbody'): # 匹配所有带data-id属性的产品行 for product_row in tbody.find_all('tr', {'data-id': True}): # 提取产品编号(data-id属性值) product_id = product_row.get('data-id') # 提取td中的产品信息 tds = product_row.find_all('td') if len(tds) >= 3: product_name = tds[0].get_text(strip=True) product_spec = tds[1].get_text(strip=True) product_price = tds[2].get_text(strip=True) # 输出提取结果 print(f"产品编号: {product_id}") print(f"产品名称: {product_name}") print(f"产品规格: {product_spec}") print(f"产品价格: {product_price}") print("---")
关键说明
- 用
{'data-id': True}是BeautifulSoup中匹配存在指定属性标签的标准写法,能精准定位所有带data-id的产品行 - 通过
get('data-id')可以直接获取该属性的取值(即产品编号) - 使用
get_text(strip=True)提取文本时会自动去除多余的空格、换行符,让结果更整洁 - 若需要批量存储数据,可以将提取的信息存入列表,最后转为
pandas.DataFrame方便后续分析
内容的提问来源于stack exchange,提问作者Lautjelief
相关产品推荐
相关产品推荐

