Python Selenium - 获取 href 值

Eri*_*hoi 28 python selenium xpath css-selectors webdriverwait

我正在尝试从网站复制 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>
Run Code Online (Sandbox Code Playgroud)

我试过了,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 文件。

感谢任何可能的帮助。

QHa*_*arr 47

如果有多个元素,您需要 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]
Run Code Online (Sandbox Code Playgroud)

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

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


Deb*_*anB 11

根据给定的 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>
Run Code Online (Sandbox Code Playgroud)

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


如果要提取需要使用的href 属性的所有值find_elements*


动态元素

但是,如果观察阶级属性,即sc-eYdvaokvdWiq理想的是动态值。因此,为了提取href你有诱发属性WebDriverWaitvisibility_of_element_located(),你可以使用以下的定位策略

  • 使用CSS_SELECTOR

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

    print(WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//p[@class='sc-eYdvao kvdWiq']/a"))).get_attribute('href'))
    
    Run Code Online (Sandbox Code Playgroud)

如果要提取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")))])
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用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")))])
    
    Run Code Online (Sandbox Code Playgroud)

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

from selenium.webdriver.support.ui import WebDriverWait     
from selenium.webdriver.common.by import By     
from selenium.webdriver.support import expected_conditions as EC
Run Code Online (Sandbox Code Playgroud)