Я хочу удалить все ссылки, которые есть у веб-сайта, и хочу отфильтровать их, чтобы я мог их потом увидеть.

Проблема дается URL, скажем,

URL = "https://stackoverflow.com/questions/"

Мой скребок должен удалить и предоставить URL, такие как

https://stackoverflow.com/questions/51284071/how-to-get-all-the-link-in-page-using-selenium-python
https://stackoverflow.com/questions/36927366/how-to-get-the-link-to-all-the-pages-of-a-website-for-data-scrapping 
https://stackoverflow.com/questions/46468032/python-selenium-automatically-load-more-pages

В настоящее время я позаимствовал код из StackOverflow

import requests
from bs4 import BeautifulSoup

def recursiveUrl(url, link, depth):
    if depth == 10:
        return url
    else:
        # print(link['href'])
        page = requests.get(url + link['href'])
        soup = BeautifulSoup(page.text, 'html.parser')
        newlink = soup.find('a')
        if len(newlink) == 0:
            return link
        else:
            return link, recursiveUrl(url, newlink, depth + 1)
def getLinks(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.text, 'html.parser')
    links = soup.find_all('a')
    for link in links:
      try:
        links.append(recursiveUrl(url, link, 0))
      except Exception as e:
        pass
    return links
links = getLinks("https://www.businesswire.com/portal/site/home/news/")
print(links)

И я думаю, что вместо просмотра всех страниц он просматривает все гиперссылки, представленные на веб-странице.

Я также ссылался на это

link = "https://www.businesswire.com/news"

from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
from scrapy.http import Request

DOMAIN = link
URL = 'http://%s' % DOMAIN

class MySpider(BaseSpider):
    name = DOMAIN
    allowed_domains = [DOMAIN]
    start_urls = [
        URL
    ]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        for url in hxs.select('//a/@href').extract():
            if not ( url.startswith('http://') or url.startswith('https://') ):
                url= URL + url
            print (url)
            yield Request(url, callback=self.parse)

Но это слишком старо и не работает.

Утилизация для меня новость, поэтому я могу застрять в некоторых основных принципах.

Дайте мне знать, как решить эту проблему.

1
Yash Kumar Atri 30 Апр 2020 в 11:15

2 ответа

Одно решение с использованием requests и bs4:

import requests
from bs4 import BeautifulSoup

url = "https://stackoverflow.com/questions/"
html = requests.get(url).content
soup = BeautifulSoup(html, "html.parser")

# Find all <a> in your HTML that have a not null 'href'. Keep only 'href'.
links = [a["href"] for a in soup.find_all("a", href=True)]
print(links)

Выход:

[
    "#",
    "https://stackoverflow.com",
    "#",
    "/teams/customers",
    "https://stackoverflow.com/advertising",
    "#",
    "https://stackoverflow.com/users/login?ssrc=head&returnurl=https%3a%2f%2fstackoverflow.com%2fquestions%2f",
    "https://stackoverflow.com/users/signup?ssrc=head&returnurl=%2fusers%2fstory%2fcurrent",
    "https://stackoverflow.com",
...

Вы можете отфильтровать их, чтобы сохранить только внешние ссылки, оставив только те, которые начинаются с http:

print([link for link in links if link.startswith("http")])

Выход:

[
    "https://stackoverflow.com",
    "https://stackoverflow.com/talent",
    "https://stackoverflow.com/advertising",
    "https://stackoverflow.com/users/login?ssrc=head&returnurl=https%3a%2f%2fstackoverflow.com%2fquestions%2f",
...
0
Arnaud 30 Апр 2020 в 08:31
import unittest
import pytest
from selenium import webdriver

class TestHabilitado(unittest.TestCase):
  def setUp(self):
    self.driver = webdriver.Firefox()
    self.vars = {}

  def test_habilitado(self):
    self.driver.get("https://stackoverflow.com/questions")

    for link in self.driver.find_elements_by_xpath("//a[contains(@class,'question-hyperlink')]"):
        url=link.get_attribute("href")
        print(url)

if __name__ == "__main__":
    unittest.main()

Я думаю, что это может быть действительным.

0
Aitor Cuartango 30 Апр 2020 в 08:53