python - 使用 Python Selenium 抓取文本:无法找到真正存在的元素
问题描述
我试图从以下页面源中抓取文本:
我使用 selenium 和 python 来抓取“Diese Termine stehen zu ...”。
到目前为止我尝试了什么?
- 使用 xpath 查找元素并使用绝对位置:
availability = driver.find_elements_by_xpath("//*[@id='booking-content']/div[2]/div[4]/div/div[2]/div/div/div/div[1]/div/div/span")
- 使用类名:
elements = driver.find_elements_by_class_name("dl-text dl-text-body dl-text-regular dl-text-s dl-text-color-inherit")
- 使用 CSS 选择器:
使用以下关键字:.booking-message .dl-text
availability = driver.find_element_by_css_selector('.booking-message .dl-text')
以上所有都不起作用。通过第 3 步,我确信它应该可以工作,因为从屏幕截图中可以看出,我可以在 Chrome 中使用相同的关键字找到元素。但仍然没有运气。
错误信息是:
Traceback (most recent call last):
File "/Users/GunardiLin/Desktop/Codes/Tracker.py", line 18, in <module>
availability = driver.find_element_by_css_selector('.booking-message .dl-text')
File "/Users/GunardiLin/opt/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 598, in find_element_by_css_selector
return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
File "/Users/GunardiLin/opt/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
'value': value})['value']
File "/Users/GunardiLin/opt/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/Users/GunardiLin/opt/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".booking-message .dl-text"}
(Session info: chrome=90.0.4430.212)
我知道另一篇有同样问题的帖子: Python with selenium:无法找到真正存在的元素
这就是我检查网站是否使用“iframe”的原因。我通过搜索“iframe-tags”来检查它,就像在屏幕截图中一样。搜索结果为 0,表示没有找到。
有人可以指点如何抓取文本吗?我更喜欢使用 css 选择器(选项 3)并且不喜欢使用选项 1(xpath + 绝对位置)。但目前我会感谢任何解决方案。
先感谢您:-)
更新:
到目前为止我的代码:
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import Select
url = r"https://www.doctolib.de/gemeinschaftspraxis/muenchen/fuchs-hierl?practitioner_id=any&speciality_id=5593&utm_campaign=website-button&utm_source=fuchs-hierl-website-button&utm_medium=referral&utm_content=custom&utm_term=fuchs-hierl"
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(executable_path="/Applications/chromedriver", options=chrome_options)
driver.get(url)
print('*** Title:', driver.title)
# print(driver.page_source.encode("utf-8"))
dropdown_besuchgrund = driver.find_element_by_id("booking_motive")
select_besuchgrund = Select(dropdown_besuchgrund)
# print(dir(select_besuchgrund))
select_besuchgrund.select_by_visible_text("Erste Impfung Covid-19 (BioNTech-Pfizer)")
# availability = driver.find_elements_by_xpath("//*[@id='booking-content']/div[2]/div[4]/div/div[2]/div/div/div/div[1]/div/div/span")
#elements = driver.find_elements_by_class_name("dl-text dl-text-body dl-text-regular dl-text-s dl-text-color-inherit")
# availability = driver.find_element_by_css_selector('.booking-message .dl-text')
availability = driver.find_element_by_xpath(".//div[contains(@class,'booking-message')]/span")
print("***")
print(availability.text)
# for elem in elements:
# print ("***", elem.text)
# if elem.text == "Diese Termine stehen zu einem späteren Zeitpunkt wieder für eine Online-Buchung zur Verfügung. ":
# print("*** Ausgebucht")
driver.quit()
@itronic1990 22.05.2021 07:45:我已经检查了您的建议:
driver.find_element_by_xpath(".//div[contains(@class,'booking-message')]/span").text
正如您在上面看到的,chrome 可以使用您的过滤器找到文本。但是如果我运行代码,它就找不到它。我的测试代码:
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
url = r"https://www.doctolib.de/gemeinschaftspraxis/muenchen/fuchs-hierl"
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(executable_path="/Applications/chromedriver", options=chrome_options)
driver.get(url)
element_text = driver.find_element_by_xpath(".//div[contains(@class,'booking-message')]/span").text
print(element_text)
driver.quit()
错误信息:
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":".//div[contains(@class,'booking-message')]/span"}
(Session info: headless chrome=90.0.4430.212)
我不明白怎么可能?谢谢你的任何建议。
解决方案
您已经在 xpath 和类名中使用了 find_elements。那正确吗?
尝试这个
driver.find_element_by_xpath(".//div[contains(@class,'booking-message')]/span").text
推荐阅读
- spring-boot - 使用 jwt 运行 Spring Boot 应用程序时出现问题
- angular - 将视图从组件传递给其他组件
- java - LocalDate.EPOCH 不可用
- jmeter - 我的 JMeter Beanshell 脚本如何确定它是否以交互方式运行?
- python - 使用 woocommerce api 创建客户时如何添加自定义字段作为元数据
- php - 如何解析 HTML 和检索多行文本
- r - 如何动态选择闪亮的仪表板皮肤?
- r - 无法重现协方差矩阵
- angular - Angular:使用带有多个模板变量的异步管道的 NgIf 的正确语法?
- java - 为什么来自相机的图像返回为缩略图?