python - 无法在 Chrome 中使用 Selenium 获取元素文本

标签 python selenium web-scraping selenium-chromedriver

我正在尝试使用 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 行。

任何帮助破译这里发生的事情以及我可以做些什么来解决它的人都将不胜感激! :+)

最佳答案

您只需要创建一个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 是行不通的。

关于python - 无法在 Chrome 中使用 Selenium 获取元素文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45656017/

相关文章:

python - 在python中基于字符串值标记数据

java - 使用@Factory TestNG时将参数传递给dataProvide

javascript - 如何使用 python 解析 Javascript 变量?

python - 为什么默认情况下 pip 包没有安装到 $PATH?

python - 将 json 文件添加到 MANIFEST.in 并安装包会导致错误

Python + Selenium : get span value from "ng-bind"

selenium - 使用 Selenium 测试 Facebook Connect 应用程序?

python - bs4 文档有什么问题?我无法运行 unwrap() 示例代码

r - 当我在 R 中使用 rvest 包解析网站时,我的用户代理是什么?

python - 将多个项目附加到 Python 中的列表列表中