无法使用 Selenium 和 Chrome 获取元素文本
Posted
技术标签:
【中文标题】无法使用 Selenium 和 Chrome 获取元素文本【英文标题】:Unable to get element text using Selenium with Chrome 【发布时间】:2018-01-21 04:48:15 【问题描述】:我正在尝试使用 Python 和 Chrome 作为 Selenium 网络驱动程序从 Merriam-Webster 的医学词典中获取医学术语。到目前为止,这就是我所拥有的:
from os import path
from selenium import webdriver
# Adding an ad-blocker to Chrome to speed up page load times
options = webdriver.ChromeOptions()
options.add_extension(path.abspath("ublock-origin.crx"))
# Declaring the Selenium webdriver
driver = webdriver.Chrome(chrome_options = options)
# Fetching the "A" terms as a test set
driver.get("https://www.merriam-webster.com/browse/medical/a")
scraped_words = [] # The list that will hold each word
page_num = 1
while page_num < 55: # There are 54 pages of "A" terms
try:
for i in range(4): # There are 3 columns per page of words
column = "/html/body/div/div/div[5]/div[2]/div[1]/div/div[3]/ul/li[" + str(i) + "]/a"
number_of_words = len(driver.find_elements_by_xpath(column))
for j in range(number_of_words):
word = driver.find_elements_by_xpath(column + "[" + str(j) + "]")
scraped_words.append(word)
driver.find_element_by_class_name("fa-angle-right").click() # Next page
page_num += 1 # Increment page number to keep track of current page
except:
driver.close()
# Write out words to a file
with open("medical_terms.dict", "w") as text_file:
for i in range(len(scraped_words)):
text_file.write(str(scraped_words[i]))
text_file.write("\n")
driver.close()
上述代码获取所有项目,因为len(scraped_words)
的输出是预期的数字。但是,由于我没有指定要获取元素的文本,因此我得到了元素标识符(我认为?)而不是文本。如果我决定使用word = driver.find_elements_by_xpath(column + "[" + str(j) + "]").text
来指定我想要获取元素的文本,我会收到以下错误:
Traceback (most recent call last):
File "mw_download.py", line 20, in <module>
number_of_words = len(driver.find_elements_by_xpath(column))
File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 325, in find_elements_by_xpath
return self.find_elements(by=By.XPATH, value=xpath)
File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 817, in find_elements
'value': value)['value']
File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 256, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: no such session
(Driver info: chromedriver=2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b),platform=Mac OS X 10.12.6 x86_64)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "mw_download.py", line 27, in <module>
driver.close()
File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 541, in close
self.execute(Command.CLOSE)
File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 256, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: no such session
(Driver info: chromedriver=2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b),platform=Mac OS X 10.12.6 x86_64)
这里让我感到奇怪的是,我在两次运行之间更改的唯一代码是在第 22 行,但错误消息却指出了第 20 行。
在破译这里发生的事情以及我能做些什么来解决它的任何帮助将不胜感激! :+)
【问题讨论】:
【参考方案1】:您只需要创建一个words
列表来访问您的元素文本,更改:
word = driver.find_elements_by_xpath(column + "[" + str(j) + "]")
到:
word = [i.text for i in driver.find_elements_by_xpath(column + "[" + str(j) + "]")]
因为.find_elements_by_xpath
总是会返回一个列表,所以直接访问.text
是行不通的。
【讨论】:
很好的解释;感谢您帮助我了解出了什么问题! :+) 该网站现在不能很好地响应我的查询,所以我无法对其进行测试 =/ 我认为上面应该可以工作。另外,请注意,您可以在后处理中删除空列表。 @paanvaanndword
是一个列表,尝试使用word[0]
操作您的更改
谢谢!几个小时前我注意到了我的错误,现在大部分时间都在工作!由于某种原因,我似乎仍然无法删除空白行,但我最终会弄清楚的。感谢所有的帮助,我希望你有一个美好的一周! :+)
现在开始工作了;我没有包括我应该在的那条线。再次感谢您的所有帮助! :+)以上是关于无法使用 Selenium 和 Chrome 获取元素文本的主要内容,如果未能解决你的问题,请参考以下文章
切换选项卡时,带有无头 chrome 的 Selenium 无法获取 url
使用 Selenium Python API 绑定从 Chrome 获取 console.log 输出