【问题标题】:Fetch all href link using selenium in python在python中使用selenium获取所有href链接
【发布时间】: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)

【问题讨论】:

  • 你想要什么而不是对象地址?
  • 实际的“价值”,即链接本身。

标签: python selenium selenium-webdriver web-scraping


【解决方案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://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]
    

    【讨论】:

      【解决方案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,但stackoverflow上的大多数答案都使用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"))
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-02-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-14
            • 2021-04-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多