Python Selenium - 获取 href 值

新手上路,请多包涵

我正在尝试从网站复制 href 值,html 代码如下所示:

 <p class="sc-eYdvao kvdWiq">
 <a href="https://www.iproperty.com.my/property/setia-eco-park/sale-
 1653165/">Shah Alam Setia Eco Park, Setia Eco Park
 </a>
</p>

我试过了 driver.find_elements_by_css_selector(".sc-eYdvao.kvdWiq").get_attribute("href") 但它返回了 'list' object has no attribute 'get_attribute' 。使用 driver.find_element_by_css_selector(".sc-eYdvao.kvdWiq").get_attribute("href") 返回 None 。但我不能使用 xpath,因为该网站有 20 多个 href,我需要将其全部复制。使用 xpath 只会复制一个。

如果有帮助,所有 20+ href 都归类在同一类下,即 sc-eYdvao kvdWiq

最终我想复制所有 20+ href 并将它们导出到 csv 文件。

感谢任何可能的帮助。

原文由 Eric Choi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

如果元素不止一个,您需要 driver.find_elements。这将返回一个列表。对于 css 选择器,您要确保选择的是那些具有子 href 的类

elems = driver.find_elements_by_css_selector(".sc-eYdvao.kvdWiq [href]")
links = [elem.get_attribute('href') for elem in elems]

您可能还需要一个等待条件,以等待 css 选择器定位的所有元素都存在。

 elems = WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".sc-eYdvao.kvdWiq [href]")))

原文由 QHarr 发布,翻译遵循 CC BY-SA 4.0 许可协议

根据给定的 HTML:

 <p class="sc-eYdvao kvdWiq">
    <a href="https://www.iproperty.com.my/property/setia-eco-park/sale-1653165/">Shah Alam Setia Eco Park, Setia Eco Park</a>
</p>

由于 href 属性在 <a> 标签内,理想情况下您需要更深入地移动到 <a> 节点。因此,要提取 href 属性 的值,您可以使用以下任一 定位器策略

  • 使用 css_selector
   print(driver.find_element_by_css_selector("p.sc-eYdvao.kvdWiq > a").get_attribute('href'))

  • 使用 xpath
   print(driver.find_element_by_xpath("//p[@class='sc-eYdvao kvdWiq']/a").get_attribute('href'))


如果要提取 href 属性 的所有值,则需要使用 find_elements* 代替:

  • 使用 css_selector
   print([my_elem.get_attribute("href") for my_elem in driver.find_elements_by_css_selector("p.sc-eYdvao.kvdWiq > a")])

  • 使用 xpath
   print([my_elem.get_attribute("href") for my_elem in driver.find_elements_by_xpath("//p[@class='sc-eYdvao kvdWiq']/a")])


动态元素

但是,如果您观察 属性的 ,即 sc-eYdvaokvdWiq 理想情况下,这些是 动态 值。因此,要提取 href 属性,您必须为 visibility_of_element_located() 引入 WebDriverWait 并且您可以使用以下任一 _定位器策略_:

  • 使用 CSS_SELECTOR
   print(WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "p.sc-eYdvao.kvdWiq > a"))).get_attribute('href'))

  • 使用 XPATH
   print(WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//p[@class='sc-eYdvao kvdWiq']/a"))).get_attribute('href'))


如果要提取 href 属性 的所有值,您可以使用 visibility_of_all_elements_located() 代替:

  • 使用 CSS_SELECTOR
   print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "p.sc-eYdvao.kvdWiq > a")))])

  • 使用 XPATH
   print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//p[@class='sc-eYdvao kvdWiq']/a")))])

注意:您必须添加以下导入:

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

原文由 undetected Selenium 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题