zhangsonghong001 2021-12-16 20:07 采纳率: 100%
浏览 131
已结题

xpath定位一模一样的元素,为什么selenium会报错

一开始用requests模块,爬虫京东商品的标题属性,这款定位元素后转化为文本,并且打印没问题。代码如下:

import requests
from lxml import etree

headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
url='https://search.jd.com/Search?keyword=T%E6%81%A4%E5%A5%B3&enc=utf-8&wq=T恤女'

res=requests.get(url,headers=headers).content


doc=etree.HTML(res)

name=doc.xpath('//*[@id="J_goodsList"]/ul/li/div/div[4]/a/i/text()')

print(name)

以下是爬取后打印出标题的内容 :
['红蜻蜓 长袖t恤女2021年秋冬季新款宽松时尚打底衫早秋百搭显瘦女装纯棉圆领卫衣T恤 H-Y0135A浅杏色 M', '红蜻蜓 长袖t恤女2021年秋冬季新款减龄宽松设计感T恤圆领显瘦打底衫时尚百搭女装纯棉卫衣 S3197#ZS蓝 M', '蕾诺希 21年秋装新款韩版体恤上衣女士打底衫外穿秋衣 百搭宽松纯色大码长袖t恤女棉9978 酒红色 XXL', '蕾诺希 长袖T恤女棉2021春秋装新款韩版百搭简约纯色外穿秋衣打底衫中老年妈妈宽松大码上衣潮8600 砖红色 3XL(建议140-150斤)', '舒适面料,好版型!', '点关注,不迷路,加购物,时尚潮流新品,支持7天无理由退换!闪电退款', '昱樱 天鹅绒T恤女秋冬2021新款韩版时尚黑色修身显瘦内搭半高领加厚针织衫女打底衫毛衣女士小衫上衣 孔雀蓝 XL(建议120-135斤)', '更多秋冬新款,欢迎进店选购,加购优先发货。', '有加绒不加绒两款,好面料制作好衣服!', '产品质量保证,7天无理由退换货提供保障。', '红蜻蜓 长袖t恤女2021年秋冬季新款内搭打底衫宽松圆显瘦领时尚百搭女装纯棉上衣潮卫衣 7A183宝蓝色 L', '红蜻蜓 长袖t恤女2021年秋冬季新款韩版打底衫时尚百搭显瘦女装纯棉上衣T恤 白色 M', '蕾诺希2021秋装新款韩版宽松大码长袖T恤女棉 外穿秋衣百搭简约打底衫女士体恤上衣服8181 咖啡色 M(建议100-115斤)', '热销爆款,优质面料,不褪色,不起毛,百搭显瘦,现货速发!点击进店', '新品上市~,舒适百搭!', '2021秋装上新,品质保证,支持7天无理由退换,请放心购买!', 'MOCO2021夏季新品趣味泰迪熊宽松T恤MBA2TEET35 摩安珂 钢灰色 S/160', '更多秋冬新款,欢迎进店选购,加购优先发货。', '时尚秋冬毛衣,你值得拥有!', '秋冬季新款上新,点击拼团购买', '红蜻蜓 字母长袖秋季卫衣女2021年秋冬新款韩版宽松洋气时尚小个子打底衫百搭女装t恤上衣外套可选加绒 白色常规 M', '红蜻蜓 长袖t恤女2021年秋冬季新女士时尚洋气打底衫纯棉圆领百搭女装上衣无帽卫衣 Y0039A浅杏色 L', '蕾诺希 长袖T恤女棉宽松大码百搭上衣纯色外穿秋衣中年妈妈打底衫21年春秋装新款体恤8189 焦糖色 L(建议105-120斤)', '【秒杀599】礼盒装100%高端绒衫,12月16日12:00限时秒杀24h\n【高端品质】京东自有品牌|精选纱线细至15.8um|柔软亲肤,点击购买', '好面料,好版型!']


但是换成selenium进行操作后,同样用xpath定位元素后 提示列表无法转换文本。

from selenium import webdriver

driver=webdriver.Chrome()
driver.get('https://search.jd.com/Search?keyword=T%E6%81%A4%E5%A5%B3&enc=utf-8&wq=T恤女'
)

name=driver.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li/div/div[4]/a/i').text

print(name)

以下是报错内容:
Warning (from warnings module):
  File "C:\Users\Administrator\Desktop\编程\selenium京东.py", line 7
    name=driver.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li/div/div[4]/a/i').text
DeprecationWarning: find_elements_by_* commands are deprecated. Please use find_elements() instead
Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\编程\selenium京东.py", line 7, in <module>
    name=driver.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li/div/div[4]/a/i').text
AttributeError: 'list' object has no attribute 'text'




因为获取的数量无法转换文本形式,所以试图把获取到的数据用for循环打印 但是为什么只会打印出一个内容?


name=driver.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li/div/div[4]/a/i')   #这里报错后去掉.text

for each in name:                                                                                               #试图用for循环打印  直接打印each数据的话,打印数据不是文本形式
    name=each.text   
    print(name)                                                                                                   # 把each进行转化each.text  只能打印出一个数据

后面在尝试了下,先生成一个空的列表 ,再把把获取到的name元素。用列表append加入进去,生成新列表是
非文本模式
这种方法也无法转化为文本存储。

都是用xpath定位的元素,第一种能正常爬取,第二种为什么无法转化为text形式。for 循环变成.text的形式为何只能打印出一个内容。

  • 写回答

2条回答 默认 最新

  • 陈.py 2021-12-17 15:13
    关注

    是text的问题,因为获取的内容是隐藏元素的文本,不能直接.text进行获取

    
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('https://search.jd.com/Search?keyword=T%E6%81%A4%E5%A5%B3&enc=utf-8&wq=T恤女')
    
    name = driver.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li/div/div[4]/a/i')
    
    for i in name:
        print(i.get_attribute('textContent'))
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月25日
  • 已采纳回答 12月17日
  • 创建了问题 12月16日

悬赏问题

  • ¥15 qc代码,修改和添加东西
  • ¥50 Unity的粒子系统使用shadergraph(内置管线)制作的一个顶点偏移shader,但是粒子模型移动时,顶点也会偏移
  • ¥15 如何用python处理excel的数据(极值标准化)
  • ¥15 三向应力状态求剪应力
  • ¥15 jupyter notebook如何添加libGL.so.1库
  • ¥20 easyPoi能否实现下拉多选或者复选框
  • ¥15 网桥在转发帧时,会变帧的源地址和目的地址吗?
  • ¥15 用Multisim设计汽车尾灯控制电路
  • ¥100 求用matlab求解上述微分方程的程序代码
  • ¥15 MAC安装佳能LBP2900驱动的网盘提取码