Python eBay爬虫生成的Pandas DataFrame存在大量空行求助
eBay爬虫空行问题的精准元素选择方案
给你几个靠谱的定位思路,从根源上避开无关的li元素,不用靠dropna擦屁股:
1. 基于商品列表的专属父容器定位
eBay的商品列表通常会放在一个带有特定class的<ul>里(比如常见的srp-results),而顶部轮播、侧边栏的li属于完全不同的父容器。直接先锁定这个父ul,再抓里面的子li,就能精准命中商品项:
from bs4 import BeautifulSoup import pandas as pd # 假设你已经获取并解析页面HTML到soup对象 # 先锁定商品列表的父ul,再选择子li product_items = soup.select('ul.srp-results li.srp-item') # 遍历提取数据 product_data = [] for item in product_items: # 提取标题,加判断避免报错 title = item.select_one('.s-item__title').get_text(strip=True) if item.select_one('.s-item__title') else "" # 提取价格 price = item.select_one('.s-item__price').get_text(strip=True) if item.select_one('.s-item__price') else "" # 其他字段(比如链接、运费)同理处理 product_data.append({ '商品标题': title, '商品价格': price }) # 生成DataFrame并导出 df = pd.DataFrame(product_data) df.to_csv('ebay_products.csv', index=False)
核心就是缩小选择范围,只抓目标父容器下的li,从根源上避免误抓轮播或其他无关元素。
2. 用伪类排除无关li
如果某些无关li有明显的特征class(比如轮播项的carousel-item、广告项的srp-ad-item),可以用CSS的:not()伪类直接排除它们:
# 选择所有li,但排除广告项和轮播项 product_items = soup.select('li:not(.srp-ad-item):not(.carousel-item)') # 或者结合父容器更精准 product_items = soup.select('ul.srp-results li:not(.srp-ad-item)')
3. 修正data-viewport选择器的写法
你之前用data-viewport得到空DataFrame,大概率是选择器写得不对。eBay的商品li的data-viewport属性通常包含index字段,试试用属性包含选择器:
# 选择带有data-viewport属性且值包含"index"的li product_items = soup.select('li[data-viewport*="index"]')
如果还是不行,打开浏览器开发者工具,右键查看商品li的data-viewport具体值,把选择器写得更精确,比如:
product_items = soup.select('li[data-viewport^="{\\"index\\":"]')
额外提醒
- 爬eBay别忘看robots.txt,控制请求频率,别猛刷导致IP被封
- 如果页面是动态加载的(滚动才加载更多商品),BeautifulSoup抓不到后续内容,这时候得用Selenium或Playwright模拟浏览器滚动
内容的提问来源于stack exchange,提问作者Flintzer0
相关产品推荐
相关产品推荐

