【发布时间】:2021-05-21 13:22:39
【问题描述】:
我试图从以下页面源中抓取文本:
我使用 selenium 和 python scrape“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: unable to locate element which really exist
这就是我检查网站是否使用“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)
我不明白为什么?谢谢你的建议。
【问题讨论】:
-
也许您在应用
driver.find_element_by_css_selector('.booking-message .dl-text')之前错过了一些等待/延迟? -
你能分享那个网页的链接吗?
-
@gunardilin 你到底想得到什么?你的预期输出是什么?
-
@gunardilin 我打开了那个链接。我看不到任何与
.booking-message .dl-text定位器匹配的元素。我确实看到位于.booking-message的元素,但里面什么都没有。 -
通过等待/延迟我的意思是让一些预期的条件等待一些条件,例如让元素可见等。但我仍然看不到这个元素我不确定这是相关的。但是,该网站可能会针对不同位置提供不同的数据,因此它显示的不是您在那里看到的内容
标签: python selenium web-scraping