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



我想解析此网站的地址(https://www.conad.it/)在搜索栏中搜索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>

我只希望<p>中的输出在上面的输出中,但对于类'col-md-8中的所有属性,因此对于CAP的这个例子,对于第二个地址也是如此。

最理想的情况是,我想把它存储在一个数据集中,我可以把它附加到不同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
CAPS = ['11100']
for CAP in CAPS:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='location-input']"))).send_keys(CAP)
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"))

感谢您的帮助!

您可以使用WebDriverWait()并等待visibility_of_all_elements_located((和下面的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_btn cc_btn_accept_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等位于<div>的子<p>标签中,因此您需要更深入一步。

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

  • 优化的解决方案:

    • 使用xpathget_attribute("innerHTML"):

      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]")))])
      
    • 使用xpathtext属性:

      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]")))])
      

最新更新