Selenium WebDriver 写入 CSV 文件时出现意外结果
Selenium WebDriver Unexpected result while writing to CSV file
我正在尝试通过 Selenium WebDriver 在 Python
中将一些数据写入 CSV 文件
我正在使用 Geckodriver v0.21.0
和 Mozilla v61.0.1
这是我的代码
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.common.exceptions import NoSuchElementException
import csv
import traceback
cap = DesiredCapabilities().FIREFOX
cap["marionette"] = False
browser = webdriver.Firefox(capabilities=cap, executable_path="C:\usr\local\bin\geckodriver.exe")
browser.get('https://whosebug.com/questions?pagesize=10')
data = []
while True:
try:
elm = browser.find_element_by_link_text("next")
browser.execute_script("return arguments[0].scrollIntoView();", elm)
elm.click()
labels = browser.find_elements_by_xpath('.//a[@class="question-hyperlink"]')
data.append(labels)
for label in labels:
with open('output.csv', 'wb') as data_file:
writer = csv.writer(data_file)
writer.writerows(data)
except NoSuchElementException:
print(traceback.format_exc())
break
但是我在我的 CSV 文件中得到了 Wired 结果
"<selenium.webdriver.firefox.webelement.FirefoxWebElement (session=""f45d368b-462d-46b6-b9f5-c28392cdc2eb"", element=""{38980652-52c8-472b-a8a0-3e7909247bd4}"")>","<selenium.webdriver.firefox.webelement.FirefoxWebElement (session=""f45d368b-462d-46b6-b9f5-c28392cdc2eb"", element=""{c1c746e1-58d2-42ec-972f-d35993062200}"")>"
我错过了什么?
您正在尝试将 webElement 写入 csv 文件
labels = browser.find_elements_by_xpath('.//a[@class="question-hyperlink"]')
WebElement 只会那样。如果你想写在那个元素上显示的文本,那么在 java 中使用 gettext,如下所示
driver.findElement(By.name("btnI")).getText()
根据您的代码,如下所示
for label in labels:
data.append(label.gettext()) //i am just giving hint, syntax may not correct.
然后将数据添加到 csv 文件
@murali selenium 是正确的,您需要在写入文件之前从元素中提取文本。
您需要在 try 块中执行类似的操作:
try:
elm = browser.find_element_by_link_text("next")
browser.execute_script("return arguments[0].scrollIntoView();", elm)
elm.click()
labels = browser.find_elements_by_xpath('.//a[@class="question-hyperlink"]')
text = [x.text for x in labels]
data.append(text)
with open('output.csv', 'w') as data_file:
writer = csv.writer(data_file)
writer.writerows(data)
except NoSuchElementException:
print(traceback.format_exc())
break
您正在使用 writerows
,因此您不需要 for label in labels:
,尤其是因为您甚至没有在循环中使用 label
。
我正在尝试通过 Selenium WebDriver 在 Python
中将一些数据写入 CSV 文件我正在使用 Geckodriver v0.21.0
和 Mozilla v61.0.1
这是我的代码
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.common.exceptions import NoSuchElementException
import csv
import traceback
cap = DesiredCapabilities().FIREFOX
cap["marionette"] = False
browser = webdriver.Firefox(capabilities=cap, executable_path="C:\usr\local\bin\geckodriver.exe")
browser.get('https://whosebug.com/questions?pagesize=10')
data = []
while True:
try:
elm = browser.find_element_by_link_text("next")
browser.execute_script("return arguments[0].scrollIntoView();", elm)
elm.click()
labels = browser.find_elements_by_xpath('.//a[@class="question-hyperlink"]')
data.append(labels)
for label in labels:
with open('output.csv', 'wb') as data_file:
writer = csv.writer(data_file)
writer.writerows(data)
except NoSuchElementException:
print(traceback.format_exc())
break
但是我在我的 CSV 文件中得到了 Wired 结果
"<selenium.webdriver.firefox.webelement.FirefoxWebElement (session=""f45d368b-462d-46b6-b9f5-c28392cdc2eb"", element=""{38980652-52c8-472b-a8a0-3e7909247bd4}"")>","<selenium.webdriver.firefox.webelement.FirefoxWebElement (session=""f45d368b-462d-46b6-b9f5-c28392cdc2eb"", element=""{c1c746e1-58d2-42ec-972f-d35993062200}"")>"
我错过了什么?
您正在尝试将 webElement 写入 csv 文件
labels = browser.find_elements_by_xpath('.//a[@class="question-hyperlink"]')
WebElement 只会那样。如果你想写在那个元素上显示的文本,那么在 java 中使用 gettext,如下所示
driver.findElement(By.name("btnI")).getText()
根据您的代码,如下所示
for label in labels:
data.append(label.gettext()) //i am just giving hint, syntax may not correct.
然后将数据添加到 csv 文件
@murali selenium 是正确的,您需要在写入文件之前从元素中提取文本。
您需要在 try 块中执行类似的操作:
try:
elm = browser.find_element_by_link_text("next")
browser.execute_script("return arguments[0].scrollIntoView();", elm)
elm.click()
labels = browser.find_elements_by_xpath('.//a[@class="question-hyperlink"]')
text = [x.text for x in labels]
data.append(text)
with open('output.csv', 'w') as data_file:
writer = csv.writer(data_file)
writer.writerows(data)
except NoSuchElementException:
print(traceback.format_exc())
break
您正在使用 writerows
,因此您不需要 for label in labels:
,尤其是因为您甚至没有在循环中使用 label
。