Python Selenium-获取href值

时间:2019-02-25 08:48:27

标签: python selenium web-scraping

我正在尝试从网站复制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文件中。

感谢所有可能的帮助。

5 个答案:

答案 0 :(得分:3)

按照给定的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 属性的值,可以使用以下任一Locator Strategies

  • 使用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")])
    

动态元素

但是,如果您观察 class 属性的,即sc-eYdvaokvdWiq最好是动态的 价值观。因此,要提取href属性,必须为visibility_of_element_located()引入WebDriverWait,并且可以使用以下任一 Locator Strategies

  • 使用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

答案 1 :(得分: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]")))

答案 2 :(得分:0)

尝试类似的东西:

elems = driver.find_elements_by_xpath("//p[contains(@class, 'sc-eYdvao') and contains(@class='kvdWiq')]/a")
for elem in elems:
   print elem.get_attribute['href']

答案 3 :(得分:0)

要抓取任何超链接或 Href,proxycrwal API 是理想的选择,因为它使用预先构建的函数来获取所需信息。只需 pip install API 并按照代码获取所需的输出。第二种使用 python selenium 获取 Href 链接的方法是运行以下代码。

<块引用>

源代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time

list = ['https://www.heliosholland.com/Ampullendoos-voor-63-ampullen','https://www.heliosholland.com/lege-testdozen’]
driver = webdriver.Chrome()
wait = WebDriverWait(driver,29)

for i in list: 
  driver.get(i)
  image = wait.until(EC.visibility_of_element_located((By.XPATH,'/html/body/div[1]/div[3]/div[2]/div/div[2]/div/div/form/div[1]/div[1]/div/div/div/div[1]/div/img'))).get_attribute('src')
  print(image)

要抓取链接,请使用 .get_attribute('src')。

答案 4 :(得分:-1)

XPATH

//p[@class='sc-eYdvao kvdWiq']/a

返回您要查找的元素。

将数据写入CSV文件与抓取挑战无关。只需尝试查看示例,您就可以做到。