在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 中加载所有资源 [重复]