在python中使用selenium获取所有href链接

问题描述 投票:0回答:11

我正在Python中练习Selenium,我想使用Selenium获取网页上的所有链接。

例如,我想要

http://psychoticelites.com/
 上所有 
href=
python selenium selenium-webdriver web-scraping
11个回答
105
投票

对于 Selenium >4.3.0,您可以尝试以下操作:

from selenium.webdriver.common.by import By

elems = driver.find_elements(by=By.XPATH, "//a[@href]")
for elem in elems:
    print(elem.get_attribute("href"))

您也可以参考答案这里以获得更详细的解释。


注意:以下解决方案适用于 Selenium <4.3.0.

好吧,你只需循环浏览列表即可:

elems = driver.find_elements_by_xpath("//a[@href]")
for elem in elems:
    print(elem.get_attribute("href"))

find_elements_by_*
返回元素列表(注意“elements”的拼写)。循环遍历列表,获取每个元素并从中获取所需的属性值(在本例中为
href
)。


10
投票

我已经检查并测试了有一个名为 find_elements_by_tag_name() 的函数可以使用。这个例子对我来说效果很好。

elems = driver.find_elements_by_tag_name('a')
    for elem in elems:
        href = elem.get_attribute('href')
        if href is not None:
            print(href)

5
投票
driver.get(URL)
time.sleep(7)
elems = driver.find_elements_by_xpath("//a[@href]")
for elem in elems:
    print(elem.get_attribute("href"))
driver.close()

注意:添加延迟非常重要。首先在调试模式下运行它并确保您的 URL 页面已加载。如果页面加载缓慢,请增加延迟(睡眠时间),然后提取。

如果您仍然遇到任何问题,请参阅下面的链接(用示例解释)或评论

使用 selenium webdriver 从网页中提取链接


3
投票

你可以尝试这样的事情:

    links = driver.find_elements_by_partial_link_text('')

3
投票

使用 Selenium 的

driver.find_elements_by_***
不再适用于 Selenium 4。当前的方法是将 find_elements()
By
 类一起使用。

方法一:For循环

下面的代码使用了 2 个列表。一个代表

By.XPATH

,另一个代表 
By.TAG_NAME
。可以使用“非此即彼”。两者都不需要。

By.XPATH

 IMO 是最简单的,因为它不会像 
None
 那样返回看似无用的 
By.TAG_NAME
 值。该代码还删除了重复项。

from selenium.webdriver.common.by import By driver.get("https://www.amazon.com/") href_links = [] href_links2 = [] elems = driver.find_elements(by=By.XPATH, value="//a[@href]") elems2 = driver.find_elements(by=By.TAG_NAME, value="a") for elem in elems: l = elem.get_attribute("href") if l not in href_links: href_links.append(l) for elem in elems2: l = elem.get_attribute("href") if (l not in href_links2) & (l is not None): href_links2.append(l) print(len(href_links)) # 360 print(len(href_links2)) # 360 print(href_links == href_links2) # True
方法2:列表理解

如果重复项没问题,可以使用一个线性列表理解。

from selenium.webdriver.common.by import By driver.get("https://www.amazon.com/") elems = driver.find_elements(by=By.XPATH, value="//a[@href]") href_links = [e.get_attribute("href") for e in elems] elems2 = driver.find_elements(by=By.TAG_NAME, value="a") # href_links2 = [e.get_attribute("href") for e in elems2] # Does not remove None values href_links2 = [e.get_attribute("href") for e in elems2 if e.get_attribute("href") is not None] print(len(href_links)) # 387 print(len(href_links2)) # 387 print(href_links == href_links2) # True
    

2
投票
您可以使用Python中的html dom库导入HTML dom。您可以在这里找到它并使用 PIP 安装它:

https://pypi.python.org/pypi/htmldom/2.0

from htmldom import htmldom dom = htmldom.HtmlDom("https://www.github.com/") dom = dom.createDom()

上面的代码创建了一个HtmlDom对象。HtmlDom有一个默认参数,即页面的url。创建dom对象后,您需要调用

HtmlDom的“createDom”方法。这将解析 html 数据并构造解析树,然后可用于搜索和操作 html 数据。该库施加的唯一限制是数据(无论是 html 还是 xml)都必须有一个根元素。

您可以使用 HtmlDom 对象的“find”方法查询元素:

p_links = dom.find("a") for link in p_links: print ("URL: " +link.attr("href"))

上面的代码将打印网页上存在的所有链接/网址


2
投票
不幸的是,OP发布的原始链接已失效......

如果您正在寻找一种方法来抓取页面上的链接,请按照以下步骤使用

gazpacho 抓取此页面上的所有“热门网络问题”链接:

from gazpacho import Soup url = "https://stackoverflow.com/q/34759787/3731467" soup = Soup.get(url) a_tags = soup.find("div", {"id": "hot-network-questions"}).find("a") [a.attrs["href"] for a in a_tags]
    

1
投票
您可以通过使用 BeautifulSoup 以非常简单有效的方式来做到这一点。我已经测试了下面的代码并且可以很好地达到相同的目的。

此行之后 -

driver.get("http://psychoticelites.com/")
使用以下代码-

response = requests.get(browser.current_url) soup = BeautifulSoup(response.content, 'html.parser') for link in soup.find_all('a'): if link.get('href'): print(link.get("href")) print('\n')
    

1
投票
2023 年:

url = "https://example.com" driver.get(url) raw_links = driver.find_elements(By.XPATH, '//a [@href]') for link in raw_links: l = link.get_attribute("href") print("raw_link:{}".format(l))
    

0
投票
import requests from selenium import webdriver import bs4 driver = webdriver.Chrome(r'C:\chromedrivers\chromedriver') #enter the path data=requests.request('get','https://google.co.in/') #any website s=bs4.BeautifulSoup(data.text,'html.parser') for link in s.findAll('a'): print(link)
    

0
投票
现有解决帖子的更新: 对于当前版本,它需要是:

elems = driver.find_elements_by_xpath("//a[@href]") for elem in elems: print(elem.get_attribute("href"))
    
© www.soinside.com 2019 - 2024. All rights reserved.