如何在python中解析具有相同类名的网站的多个属性?
在搜索栏中搜索CAP并输入结果后,我想用Pyhthon解析此网站()的地址。对于许多CAP,有许多存储地址,因此我希望将它们全部删除,而不仅仅是第一个(这就是我的代码现在正在做的) 以下是我目前的代码:如何在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_
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]")))])