Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用classname、css选择器和xpath从网站查找元素_Python_Python 3.x_Selenium - Fatal编程技术网

Python 使用classname、css选择器和xpath从网站查找元素

Python 使用classname、css选择器和xpath从网站查找元素,python,python-3.x,selenium,Python,Python 3.x,Selenium,我正在寻找代码方面的帮助 我试图从一个网站打印出一个元素,但是我从我尝试的方法中得到了不同的错误消息,它们都不起作用 我已尝试将class_name与以下代码一起使用: from selenium import webdriver browser = webdriver.Chrome('/home/cena/Downloads/chromedriver') poeisz_url = "https://webwinkel.poiesz-supermarkten.nl/boodschapp

我正在寻找代码方面的帮助

我试图从一个网站打印出一个元素,但是我从我尝试的方法中得到了不同的错误消息,它们都不起作用

我已尝试将class_name与以下代码一起使用:

from selenium import webdriver    
browser = webdriver.Chrome('/home/cena/Downloads/chromedriver')

poeisz_url = "https://webwinkel.poiesz-supermarkten.nl/boodschappen/producten/631258"
poeisz_classname = "full-product full-product--price__for"

browser.get(poeisz_url)
elem = browser.find_element_by_class_name(poeisz_classname)
print(elem.text)
这返回了以下错误消息:

Traceback (most recent call last):
  File "/home/cena/.PyCharmCE2019.1/config/scratches/scratch_2.py", line 9, in <module>
    elem = browser.find_element_by_class_name(poeisz_classname)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 564, in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: Compound class names not permitted
  (Session info: chrome=74.0.3729.169)
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Linux 4.15.0-50-generic x86_64)
他们依次返回了以下错误:

Traceback (most recent call last):
  File "/home/cena/.PyCharmCE2019.1/config/scratches/scratch_2.py", line 9, in <module>
    elem = browser.find_element_by_xpath("//*[@class='" + poeisz_classname + "']")
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.7/dist-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":"xpath","selector":"//*[@class='full-product full-product--price__for']"}
  (Session info: chrome=74.0.3729.169)
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Linux 4.15.0-50-generic x86_64)
回溯(最近一次呼叫最后一次):
文件“/home/cena/.PyCharmCE2019.1/config/scratch/scratch_2.py”,第9行,在
elem=browser。通过xpath(“/*[@class=”+poeisz\u classname+“]”)查找元素
文件“/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py”,第394行,按xpath查找元素
返回self.find_元素(by=by.XPATH,value=XPATH)
文件“/usr/local/lib/python3.7/dist packages/selenium/webdriver/remote/webdriver.py”,第978行,在find_元素中
'value':value})['value']
文件“/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py”,执行中第321行
self.error\u handler.check\u响应(响应)
文件“/usr/local/lib/python3.7/dist packages/selenium/webdriver/remote/errorhandler.py”,第242行,在check_响应中
引发异常类(消息、屏幕、堆栈跟踪)
selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法定位元素:{“方法”:“xpath”,“选择器”:“/*[@class='full-product full-product-product--price_for']”}
(会话信息:chrome=74.0.3729.169)
(驱动程序信息:chromedriver=74.0.3729.6(255758ECCF3D24491B8A1317AA76E1CE10D57E9参考/分支头/3729{29}),平台=Linux 4.15.0-50-generic x86_64)
回溯(最近一次呼叫最后一次):
文件“/home/cena/.PyCharmCE2019.1/config/scratch/scratch_2.py”,第9行,在
elem=browser。通过css选择器(“*[class^=”+poeisz\u classname+“]”)查找元素
文件“/usr/local/lib/python3.7/dist packages/selenium/webdriver/remote/webdriver.py”,第598行,按css选择器查找元素
返回self.find_元素(by=by.CSS_选择器,value=CSS_选择器)
文件“/usr/local/lib/python3.7/dist packages/selenium/webdriver/remote/webdriver.py”,第978行,在find_元素中
'value':value})['value']
文件“/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py”,执行中第321行
self.error\u handler.check\u响应(响应)
文件“/usr/local/lib/python3.7/dist packages/selenium/webdriver/remote/errorhandler.py”,第242行,在check_响应中
引发异常类(消息、屏幕、堆栈跟踪)
selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“方法”:“css选择器”,“选择器”:“*[class^='full-product full-product-price_for']”
(会话信息:chrome=74.0.3729.169)
(驱动程序信息:chromedriver=74.0.3729.6(255758ECCF3D24491B8A1317AA76E1CE10D57E9参考/分支头/3729{29}),平台=Linux 4.15.0-50-generic x86_64)
我对编程很陌生,所以如果这是件愚蠢的事情,我很抱歉。提前感谢您的帮助

您应该使用:

例如XPath:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Chrome('/home/cena/Downloads/chromedriver')
url = "https://webwinkel.poiesz-supermarkten.nl/boodschappen/producten/631258"
driver.get(url)
my_el = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//div[@id="products"]//*[@class="full-product full-product--price__for"]')))
print(my_el.text)
输出为:

0 99

使用
WebDriverWait
的更好方法是将其用作变量:

wait = WebDriverWait(driver, 20)
my_el = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@id="products"]//*[@class="full-product full-product--price__for"]')))
如前所述,您可能希望使用位于的元素的可见性()而不是位于的元素的存在性


希望这对你有帮助

第一条错误消息解释了您遇到的问题

选择器无效:不允许使用复合类名

find_element_by_class_name()
采用单个类名作为参数,但“完整产品-完整产品-价格-价格”包含两个类名(注意:类名用空格分隔,所以这里有两个…“完整产品”和“完整产品-价格-价格-价格”

您可以将定位器转换为CSS选择器,
.full product.full product--
的price\u,它应该可以正常工作

要阅读有关CSS选择器的更多信息,请参阅下面的链接




如果您不介意我问一下,为什么这样做?对不起,我没有太多经验:)基本思想是显式地等待一个元素。。。发生的情况是,有时您的驱动程序运行速度很快,但元素尚未加载。。。这是使用显式等待而不是睡眠的最佳实践。。。
Traceback (most recent call last):
  File "/home/cena/.PyCharmCE2019.1/config/scratches/scratch_2.py", line 9, in <module>
    elem = browser.find_element_by_css_selector("*[class^='" + poeisz_classname + "']")
  File "/usr/local/lib/python3.7/dist-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 "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.7/dist-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":"*[class^='full-product full-product--price__for']"}
  (Session info: chrome=74.0.3729.169)
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Linux 4.15.0-50-generic x86_64)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Chrome('/home/cena/Downloads/chromedriver')
url = "https://webwinkel.poiesz-supermarkten.nl/boodschappen/producten/631258"
driver.get(url)
my_el = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//div[@id="products"]//*[@class="full-product full-product--price__for"]')))
print(my_el.text)
wait = WebDriverWait(driver, 20)
my_el = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@id="products"]//*[@class="full-product full-product--price__for"]')))