我想将抓取数据保存为CSV。所以我决定使用Pandas,因为我想在数据框中显示数据。但是在查找元素ID时出现错误。我不知道我的编码方式是否错误,或者是否还需要在编码中添加其他内容。顺便说一句,
mainli_waninfo #is用于状态标签
subli_voipmaintain #is for 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']"]
答案 0 :(得分:0)
您看到这似乎是错误: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'])
,依此类推。