当前位置: 首页 > 知识库问答 >
问题:

Selenium AttributeError:列表对象没有属性find_element_by_xpath

魏朗
2023-03-14

我正试图从一个网站上搜集一些营养数据,到目前为止一切似乎都进行得很顺利,直到我遇到格式略有不同的页面。

使用selenium和这样的一行,返回一个空列表:

values = browser.find_elements_by_class_name('size-12-fl-oz' or 'size-330-ml hide nutrition-value' or 'size-8-fl-oz nutrition-value')

打印将返回以下内容:

[]
[]
[]
[]
[]

但是,如果我定义出元素位置,那么它就可以正常工作:

kcal = data.find_elements_by_xpath("(.//div[@class='size-12-fl-oz nutrition-value' or 'size-330-ml hide nutrition-value' or 'size-8-fl-oz nutrition-value'])[position()=1]").text

我遇到的问题是,当我迭代时,页面之间的元素不相同。因此,如果div在位置9不存在,那么就会抛出一个错误。

现在,当我返回并尝试编辑我的代码来执行< code>try/catch时,我得到:

属性错误:“列表”对象没有属性“find_element_by_xpath”

attribute error:“list”对象没有属性“find_elements_by_xpath”

下面是代码,以及我前后测试中注释掉的部分。

import requests, bs4, urllib2, csv
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException    

browser = webdriver.Firefox()
...

#Loop on URLs to get Nutritional Information from each one.
with open('products.txt') as f:
    for line in f:
        url = line
#        url = 'http://www.tapintoyourbeer.com/index.cfm?id=3'
        browser.get(url)
        with open("output.csv", "a") as o:
            writeFile = csv.writer(o)
            browser.implicitly_wait(3)
            product_name = browser.find_element_by_tag_name('h1').text.title() #Get product name
            size = browser.find_element_by_xpath("(//div[@class='dotted-tab'])").text #Get product size
            data = browser.find_elements_by_xpath("//table[@class='beer-data-table']")
#            values=[]
#            values = browser.find_elements_by_class_name('size-12-fl-oz' or 'size-330-ml hide nutrition-value' or 'size-8-fl-oz nutrition-value')
            try:
#            values = data.find_elements_by_xpath("(.//div[@class='size-12-fl-oz nutrition-value' or 'size-330-ml hide nutrition-value' or 'size-8-fl-oz nutrition-value'])")
                kcal = data.find_element_by_xpath("(.//div[@class='size-12-fl-oz nutrition-value' or 'size-330-ml hide nutrition-value' or 'size-8-fl-oz nutrition-value'])[position()=1]").text
                kj = data.find_element_by_xpath("(.//div[@class='size-12-fl-oz nutrition-value' or 'size-330-ml hide nutrition-value' or 'size-8-fl-oz nutrition-value'])[position()=3]").text
                fat = data.find_element_by_xpath("(.//div[@class='size-12-fl-oz nutrition-value' or 'size-330-ml hide nutrition-value' or 'size-8-fl-oz nutrition-value'])[position()=5]").text
                carbs = data.find_element_by_xpath("(.//div[@class='size-12-fl-oz nutrition-value' or 'size-330-ml hide nutrition-value' or 'size-8-fl-oz nutrition-value'])[position()=7]").text
                protein = data.find_element_by_xpath("(.//div[@class='size-12-fl-oz nutrition-value' or 'size-330-ml hide nutrition-value' or 'size-8-fl-oz nutrition-value'])[position()=9]").text
                values = [kcal, kj, fat, carbs, protein]
                print values
                writeFile.writerow([product_name] + [size] + values)
            except NoSuchElementException:
                print("No Protein listed")
browser.quit()

我之前让它产生一个列表,并输出到一个CSV,但有时,位置计数会出现错误。

[u'Budweiser', u'12 FL OZ', u'145.00', u'', u'', u'', u'']
[u"Beck'S", u'12 FL OZ', u'146.00', u'610.86', u'0.00', u'10.40', u'1.80']
[u'Bud Light', u'12 FL OZ', u'110.00', u'460.24', u'0.00', u'6.60', u'0.90']
[u'Michelob Ultra', u'12 FL OZ', u'95.00', u'397.48', u'0.00', u'2.60', u'0.60']
[u'Stella Artois', u'100 ML', u'43.30', u'KCAL/100 ML', u'181.17', u'KJ/100 ML', u'0.00']

当位置9在特定页面上不存在时,问题就出现了。

关于如何解决这个头痛问题,有什么建议吗?我是否需要为不同的页面设置案例

我很感激你的帮助。

共有1个答案

刘和正
2023-03-14

实际上,< code>find_elements()返回< code>WebElement列表或空列表。您将这个结果存储到一个名为< code>data的列表变量中。

属性错误:“列表”对象没有属性“find_element_by_xpath”

attribute error:“list”对象没有属性“find_elements_by_xpath”

发生这种情况是因为您将在< code >数据列表中找到嵌套的< code>WebElement,这就是为什么您调用< code > data . find _ element _ by _ XPath()或< code > data . find _ elements _ by _ XPath()的原因,这是绝对错误的。

实际上,< code>find_element()或< code>find_elements()用于搜索页面上下文或< code>WebElement的上下文中的元素,而不是< code>list。

因此,您应该尝试从data列表中找到单独的WebElement,然后使用此元素上下文找到进一步嵌套的WebElement,如下所示:-

if len(data) > 0:
  #now find desire element using index
  individual_element = data[0]
 
  #now you can find further nested single element using find_element() or list of elements using find_elements() at individual_element context
  kcal = individual_element.find_element_by_xpath("(.//div[@class='size-12-fl-oz nutrition-value' or 'size-330-ml hide nutrition-value' or 'size-8-fl-oz nutrition-value'])[position()=1]").text

  ----------------------------
  ----------------------------
 类似资料:
  • 我正在创建词汇表,一个GUI程序来管理未知单词。我得到: /usr/bin/python3。5/主页/cali/Pycharm项目/词汇表/词汇表。Tkinter回调回溯中的py异常(最近一次调用最后一次): 文件“/usr/lib/python3.5/Tkinter/init.py”,第1553行,在调用返回self中。func(*args)文件“/home/cali/PycharmProjec

  • 当我尝试运行代码时,select元素出现问题。它会给我一个错误 就像我没有任何选择元素一样。是因为它没有关注弹出窗口吗?我做错了什么? MyCode.py select.py中的错误: 例外情况:

  • 问题内容: 如何创建一个数组到numpy数组? 我收到错误消息 所以,我想我需要将X转换为numpy数组吗? 问题答案: 使用在使用属性。 NOTE 为给定数组返回3个项目的元组;加薪。

  • 问题内容: 我正在尝试读取文件,并用逗号在每行中拆分一个单元格,然后仅显示包含有关纬度和经度信息的第一和第二个单元格。这是文件: 时间, 纬度,经度 ,类型2015-03-20T10:20:35.890Z, 38.8221664,-122.7649994 ,地震 2015-03-20T10 :18:13.070Z, 33.2073333,-116.6891667 ,地震 2015-03-20T10

  • 我试图分裂链接的图像是什么错在我的代码

  • 我在Jupyter Notebook中运行Keras神经网络模型(Python 3.6) 我得到以下错误 属性错误:列表对象没有属性ndim 从K调用. fi()方法后eras.model 我检查了Keras的requirements.txt文件(在Anaconda3中),Numpy、smpy和六个模块版本都是最新的。 什么可以解释这个属性错误? 完整的错误消息如下(似乎与Numpy有些关联):