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

Posted

技术标签:

【中文标题】在python中使用selenium获取所有href链接【英文标题】:Fetch all href link using selenium in python 【发布时间】:2016-04-18 00:28:42 【问题描述】:

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

例如,我想要http://psychoticelites.com/上所有<a>标签的href=属性中的所有链接

我已经编写了一个脚本并且它正在运行。但是,它给了我对象地址。我已经尝试使用id 标签来获取值,但是它不起作用。

我当前的脚本:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


driver = webdriver.Firefox()
driver.get("http://psychoticelites.com/")

assert "Psychotic" in driver.title

continue_link = driver.find_element_by_tag_name('a')
elem = driver.find_elements_by_xpath("//*[@href]")
#x = str(continue_link)
#print(continue_link)
print(elem)

【问题讨论】:

你想要什么而不是对象地址? 实际的“价值”,即链接本身。 【参考方案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')

【讨论】:

【参考方案2】:
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 页面正在加载。如果页面加载缓慢,请增加延迟(睡眠时间)然后提取。

如果您仍然遇到任何问题,请参考以下链接(以示例说明)或评论

Extract links from webpage using selenium webdriver

【讨论】:

我认为 sleep 命令的提示很有帮助,否则对于接受的答案来说是多余的。【参考方案3】:

不幸的是,OP发布的原始链接已死...

如果您正在寻找一种方法来抓取页面上的链接,以下是使用gazpacho 抓取此页面上所有“热门网络问题”链接的方法:

from gazpacho import Soup

url = "https://***.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]

【讨论】:

【参考方案4】:

我已经检查并测试了您可以使用名为 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)

【讨论】:

这会在href=elem.get_attribute('href') 线上为我创建一个StaleElementReferenceException 错误。在我访问它以获取属性之前,我尝试将 elem 打印到控制台,但这只是将异常移动到尝试打印的行。这是确切的消息:stale element reference: element is not attached to the page document 编辑:忘记按 shift enter 所以我没有消息。在编辑中更正【参考方案5】:

嗯,你必须简单地遍历列表:

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

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

【讨论】:

为什么所有文档都说“不推荐”xpath,但***上的大多数答案都使用xpath? XPath 不可靠。如果网站的 DOM 发生变化,XPath 也会发生变化,那么您的脚本必然会崩溃。在使用多个脚本进行报废后,我得出一个结论,即使用 XPath 作为最后的手段。 短 xpath 就像在这个例子中它们是可靠的,如果 xpath 变成长字符串,取决于依赖于布局的列/行/div 等不应该使用它们,我会使用很多 driver.find_element_by_xpath("//*[@id='<my identifier>']")。跨度> 如果我需要返回属于特定类的 href 怎么办? 您可以使用它来根据类名driver.find_elements_by_class_name("content") 获取元素,其中“content”是您要查找的类的名称。【参考方案6】:
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)

【讨论】:

【参考方案7】:

你可以试试这样的:

    links = driver.find_elements_by_partial_link_text('')

【讨论】:

【参考方案8】:

您可以在 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"))

以上代码将打印网页上的所有链接/网址

【讨论】:

以上是关于在python中使用selenium获取所有href链接的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中使用selenium Xpath从tr标签中获取所有td [3]标签

python+selenium 获取table列表中所有数据条数

等待使用 Python 在 Selenium 中加载所有资源 [重复]

无法使用 selenium python 获取多个跨度类文本

如何使用Selenium从网页获取所有元素?

Python - Selenium 和 XPATH 从表中提取所有行