【问题标题】:Pandas Python Data Frame: Unable to locate elementPandas Python Dataframe:无法找到元素
【发布时间】:2020-10-11 20:21:15
【问题描述】:

我想将抓取数据保存在 CSV 中。所以我决定使用 Pandas,因为我想在数据框中显示数据。但我在定位元素的 id 时出错。我不知道我的编码方式是错误的还是必须在编码中添加其他内容。顺便说一句,

mainli_waninfo #用于状态标签

subli_voipmaintain #用于 VoipInfo 选项卡

这是我的代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup as bs
#import requests
import time 
#import csv
import pandas
from pandas import DataFrame

passwordStr = '***'
usernameStr='***
chrome_path = r'C:\Users\wana isa\geckodriver-v0.26.0-win64\geckodriver.exe'
browser = webdriver.Firefox(executable_path=r'C:\Users\wana isa\geckodriver-v0.26.0-win64\geckodriver.exe')
browser.get(('http://******'))

wait = WebDriverWait(browser,10)


# wait for transition then continue to fill items
#time.sleep(2)
password = wait.until(EC.presence_of_element_located((By.ID, 'txt_Password')))
password.send_keys(passwordStr)
username = wait.until(EC.presence_of_element_located((By.ID, 'txt_Username')))
username.send_keys(usernameStr)

signInButton = browser.find_element_by_id('button')
signInButton.click()
browser.get(('****'))


MainTab=browser.find_element_by_name('mainli_waninfo').click()
SubTab=browser.find_element_by_name('subli_voipmaintain').click()
browser.switch_to.frame(browser.find_element_by_id('frameContent'))

html=browser.page_source
soup=bs(html,'html.parser')
#print(soup.prettify()



#for Opticalinfo
time.sleep(6)

print('[VOIP INFORMATION]')#ONT INFORMATION
v1_id=['tdVoipInfo_0_0','tdVoipInfo_0_1','tdVoipInfo_0_2','tdVoipInfo_0_3','tdVoipInfo_0_4','tdVoipInfo_0_5','tdVoipInfo_0_6','tdVoipInfo_0_7']
v2_id=['tdVoipInfo_1_0','tdVoipInfo_1_1','tdVoipInfo_1_2','tdVoipInfo_1_3','tdVoipInfo_1_4','tdVoipInfo_1_5','tdVoipInfo_1_6','tdVoipInfo_1_7']

elemntValu= browser.find_element_by_id(v1_id).text
elemntValue= browser.find_element_by_id(v2_id).text
time.sleep(6)

C = {'no': ['tdVoipInfo_0_0','tdVoipInfo_1_0'],
        'Url': ['tdVoipInfo_0_1', 'tdVoipInfo_1_1'],
        'User Name(Phone Number)': ['tdVoipInfo_0_2', 'tdVoipInfo_1_2'],
        'Associated POTS Port': ['tdVoipInfo_0_3', 'tdVoipInfo_1_3'],
        'User Status': ['tdVoipInfo_0_4', 'tdVoipInfo_1_4'],
        'Call Status': ['tdVoipInfo_0_5', 'tdVoipInfo_1_5'],
        'Registry Error': ['tdVoipInfo_0_6', 'tdVoipInfo_1_6'],
        'Error Code': ['tdVoipInfo_0_7','tdVoipInfo_1_7'],
     
    }
df = DataFrame(C, columns= ['no', 'Url', 'User Name(Phone Number)', 'Associated POTS Port','User Status','Call Status','Registry Error','Error Code'])
export_csv = df.to_csv (r'C:\pandaresult.csv', index = None, header=True) # here you have to write path, where result file will be stored
print (df)


browser.close()

这是错误:

---------------------------------------------------------------------------
NoSuchElementException                    Traceback (most recent call last)
<ipython-input-1-afe11729bf5e> in <module>
     54 v2_id=(['tdVoipInfo_1_0','tdVoipInfo_1_1','tdVoipInfo_1_2','tdVoipInfo_1_3','tdVoipInfo_1_4','tdVoipInfo_1_5','tdVoipInfo_1_6','tdVoipInfo_1_7'])
     55 
---> 56 browser.find_element_by_id(v1_id)
     57 browser.find_element_by_id(v2_id)
     58 time.sleep(6)

D:\waa\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element_by_id(self, id_)
    358             element = driver.find_element_by_id('foo')
    359         """
--> 360         return self.find_element(by=By.ID, value=id_)
    361 
    362     def find_elements_by_id(self, id_):

D:\waa\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element(self, by, value)
    976         return self.execute(Command.FIND_ELEMENT, {
    977             'using': by,
--> 978             'value': value})['value']
    979 
    980     def find_elements(self, by=By.ID, value=None):

D:\waa\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
    319         response = self.command_executor.execute(driver_command, params)
    320         if response:
--> 321             self.error_handler.check_response(response)
    322             response['value'] = self._unwrap_value(
    323                 response.get('value', None))

D:\waa\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
    240                 alert_text = value['alert'].get('text')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):

NoSuchElementException: Message: Unable to locate element: [id="['tdVoipInfo_0_0', 'tdVoipInfo_0_1', 'tdVoipInfo_0_2', 'tdVoipInfo_0_3', 'tdVoipInfo_0_4', 'tdVoipInfo_0_5', 'tdVoipInfo_0_6', 'tdVoipInfo_0_7']"]

【问题讨论】:

  • Unable to locate element 可能表明您的EC.presence_of_element_located 无法找到您想要的元素 - 检查网站是否使用您使用的名称。
  • “检查网站是否使用您使用的名称”是什么意思?因为该 id 已经存在于网站中。我直接从检查元素中获取 id。
  • 你想找到多个元素——其中一个是mainli_waninfo——是网站使用的id吗?您必须检查html 并查看是否是这种情况。此外,你在哪一行得到错误 - 这将指向哪个元素应该受到指责!
  • 我更新了问题。 mainli_waninfor 是状态选项卡的 ID。我需要废弃表格并将其保存到 csv 文件中
  • 你应该添加你的错误的完整堆栈跟踪 - 其中提到你在哪一行得到了错误! (我以 mainli... 为例 - 这可能不是给你错误的元素)

标签: python pandas selenium-webdriver beautifulsoup


【解决方案1】:

你看这似乎是错误:elemntValu= browser.find_element_by_id(v1_id).text

find_element... 需要一个字符串作为这样的参数:driver.find_element_by_id('Email'),而您正在传递整个列表。

试试看:

v1_id_values = {}

for i in v1_id:
   v1_id_values[i] = browser.find_element_by_id(i).text

print(v1_id_values['tdVoipInfo_0_0'])

您也必须对另一个列表 (v2...) 执行相同操作。

虽然我看到您尝试将值存储在 elementValue 中,然后再没有访问过它们。你也想调查一下。在我给出的示例中,要访问tdVoipInfo_0_0 的值,您必须执行v1_id_values['tdVoipInfo_0_0']) 等等。

【讨论】:

  • 你的意思是我需要对每个 id 执行此 print(v1_id_values['tdVoipInfo_0_0']) 吗?比如 print(v1_id_values['tdVoipInfo_0_1']), print(v1_id_values['tdVoipInfo_0_2']) 等等...?对不起,我在这个 python 东西上太新了 :')
  • 你想在这里做什么:'no': ['tdVoipInfo_0_0','tdVoipInfo_1_0'] - 我想你想在dictionary C 中添加你在no 键中删除的值?那么你需要:'no':[v1_id_values['tdVoipInfo_0_0'],v1_id_values['tdVoipInfo_1_0']]
猜你喜欢
  • 2018-03-14
  • 2018-08-01
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 2018-01-10
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多