Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.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中解析具有相同类名的网站的多个属性?_Python_Selenium_Xpath_Webdriver_Webdriverwait - Fatal编程技术网

如何在python中解析具有相同类名的网站的多个属性?

如何在python中解析具有相同类名的网站的多个属性?,python,selenium,xpath,webdriver,webdriverwait,Python,Selenium,Xpath,Webdriver,Webdriverwait,在搜索栏中搜索CAP并输入结果后,我想用Pyhthon解析此网站()的地址。对于许多CAP,有许多存储地址,因此我希望将它们全部删除,而不仅仅是第一个(这就是我的代码现在正在做的) 以下是我目前的代码: driver = webdriver.Chrome('pathtoChrome/chromedriver.exe') driver.get("https://www.conad.it/") WebDriverWait(driver, 20).until(EC.element_

在搜索栏中搜索CAP并输入结果后,我想用Pyhthon解析此网站()的地址。对于许多CAP,有许多存储地址,因此我希望将它们全部删除,而不仅仅是第一个(这就是我的代码现在正在做的)

以下是我目前的代码:

driver = webdriver.Chrome('pathtoChrome/chromedriver.exe')
driver.get("https://www.conad.it/")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='javascript:void(0)']"))).click() # accept the cookies
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='location-input']"))).send_keys("11100")
driver.find_element_by_xpath("//input[@class = 'btn btn-default btn-lg btn-block']").click()
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[contains(@class,'col-md-8')]"))).get_attribute("innerHTML"))

它将此作为最终输出:

<h3>Conad</h3><p>Frazione Condemine 84, 11010  Sarre</p><div class="extra-services extra-services-buttons extra-services-desktop extra-services-simple"><ul class="carousel-services"></ul></div>

感谢您的帮助

您可以使用
WebDriverWait()
并等待位于
()的所有元素的
可见性,然后按照
xpath
选项获取列表中的所有p标记值

print([item.text for item in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[contains(@class,'col-md-8')]//p")))])
您的输出就像一个列表

['Frazione Condemine 84, 11010 Sarre', 'Grand Chemin C/c Centreville 3, 11020 Saint-christophe', "Localita' Arensod 27, 11010 Sarre"]

你很接近。有几点:

  • By.XPATH,“//a[@href='javascript:void(0)]
    不是稳定的。相反,您可以使用更稳定和优化的
    By.XPATH,“//a[@class='cc\u btn\u accept\u all']
    ,如下所示:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='cc_btn cc_btn_accept_all']"))).click()
    
  • 文本
    Frazione Condemine 84、11010 Sarre
    等位于
    的子
    标记内,因此您需要更深入一步

  • 同样,我们可以构造一个更可靠的定位器,而不是
    By.XPATH,“//div[contains(@class,'col-md-8')]”
    ,因为
    标记后面总是跟着
    包含文本Conad

  • 优化的解决方案:

    • 使用xpath和
      获取属性(“innerHTML”)

    • 使用xpath和文本属性:

      print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//h3[contains(.,'Conad')]//following-sibling::p[1]")))])
      

非常感谢@KunduK这解决了没有循环的问题!然而,我仍然遇到问题,如果我想循环超过上限,因为我将不得不使这几个城市代码的工作。有什么帮助吗?它似乎卡在了我使用的
的倒数第二行。单击()
。好的,谢谢!这是一个新问题:
print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//h3[contains(.,'Conad')]//following-sibling::p[1]")))])
print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//h3[contains(.,'Conad')]//following-sibling::p[1]")))])