Рубрики
Без рубрики

Скаивание абсолютного URL вместо относительного пути с помощью BeautifulSoup в Python

Сводка: Используйте URLLIB.PARSE.URLJOIN (), чтобы соскрести базовый URL и относительный путь и присоединиться к их, чтобы извлечь полный / абсолютный URL. Вы также можете объединить базовый URL и абсолютный путь для получения абсолютного пути; Но убедитесь, что позаботиться о ошибочных ситуациях, таких как дополнительно-слеш в этом случае. Проблема разработки проблемы: как … соскабливание абсолютного URL вместо относительного пути с использованием красивой подкладки в Python Подробнее »

Автор оригинала: Shubham Sayon.

Резюме: Использовать urllib.parse.urljoin () Чтобы соскрести базовый URL и относительный путь и присоединиться к их, чтобы извлечь полный/ Абсолют Ур Вы также можете объединить базовый URL и абсолютный путь для получения абсолютного пути; Но убедитесь, что позаботиться о ошибочных ситуациях, таких как дополнительно-слеш в этом случае.

Постановка проблемы

Проблема: Как извлечь все абсолютные URL с HTML-страницы?

Пример: Рассмотрим следующую веб-страницу, которая имеет многочисленные ссылки:

Теперь, когда вы пытаетесь высказать ссылки, как указано выше, вы обнаружите, что это только относительные ссылки/пути извлекаются вместо всего абсолютного пути. Давайте посмотрим на код, приведенный ниже код, который демонстрирует, что происходит, когда вы пытаетесь извлечь элементы «HREF» нормально.

from bs4 import BeautifulSoup
import urllib.request
from urllib.parse import urljoin
import requests

web_url = 'https://sayonshubham.github.io/'
headers = {"User-Agent": "Mozilla/5.0 (CrKey armv7l 1.5.16041) AppleWebKit/537.36 (KHTML, like Gecko) "
                         "Chrome/31.0.1650.0 Safari/537.36"}
# get() Request
response = requests.get(web_url, headers=headers)
# Store the webpage contents
webpage = response.content
# Check Status Code (Optional)
# print(response.status_code)
# Create a BeautifulSoup object out of the webpage content
soup = BeautifulSoup(webpage, "html.parser")
for i in soup.find_all('nav'):
    for url in i.find_all('a'):
        print(url['href'])

Выход:

/
/about
/blog
/finxter
/

Вышеуказанный выход не то, что вы желали. Вы хотели извлечь абсолютные пути, как показано ниже:

https://sayonshubham.github.io/
https://sayonshubham.github.io/about
https://sayonshubham.github.io/blog
https://sayonshubham.github.io/finxter
https://sayonshubham.github.io/

Следовательно, без дальнейшей задержки позвольте нам идти вперед и попытаться извлечь абсолютные пути вместо относительных путей.

Метод 1: Использование URLLIB.PARSE.URLJOIN ()

Самое простое решение нашей проблемы состоит в том, чтобы использовать urllib.parse.urljoin () метод.

Согласно документации Python: urllib.parse.urljoin () Используется для построения полного/абсолютного URL, объединяя «базовый URL» с другим URL. Преимущество использования URLJOIN () Это правильно решает относительный путь, будь то Base_url это область URL или абсолютный URL веб-страницы.

from urllib.parse import urljoin

URL_1 = 'http://www.example.com'
URL_2 = 'http://www.example.com/something/index.html'

print(urljoin(URL_1, '/demo'))
print(urljoin(URL_2, '/demo'))

Выход:

http://www.example.com/demo
http://www.example.com/demo

Теперь, когда у нас есть идея о urljoin Давайте посмотрим на следующий код, который успешно решает нашу проблему и помогает нам извлечь полные/абсолютные пути с страницы HTML.

Решение:

from bs4 import BeautifulSoup
import urllib.request
from urllib.parse import urljoin
import requests

web_url = 'https://sayonshubham.github.io/'
headers = {"User-Agent": "Mozilla/5.0 (CrKey armv7l 1.5.16041) AppleWebKit/537.36 (KHTML, like Gecko) "
                         "Chrome/31.0.1650.0 Safari/537.36"}
# get() Request
response = requests.get(web_url, headers=headers)
# Store the webpage contents
webpage = response.content
# Check Status Code (Optional)
# print(response.status_code)
# Create a BeautifulSoup object out of the webpage content
soup = BeautifulSoup(webpage, "html.parser")
for i in soup.find_all('nav'):
    for url in i.find_all('a'):
        print(urljoin(web_url, url.get('href')))

Выход:

https://sayonshubham.github.io/
https://sayonshubham.github.io/about
https://sayonshubham.github.io/blog
https://sayonshubham.github.io/finxter
https://sayonshubham.github.io/

Способ 2: объединение базового URL и относительный URL вручную

Еще одна работа – вокруг нашей проблемы состоит в том, чтобы объединить базовую часть URL и относительные URL-адреса вручную, как и две обычные строки. Проблема, в этом случае, в том, что вручную добавляют строки, могут привести к ошибкам «разовые» (Spot Extra/ниже):

URL_1 = 'http://www.example.com/'
print(URL_1+'/demo')

# Output --> http://www.example.com//demo

Поэтому для обеспечения надлежащего конкатенации вы должны соответственно изменять ваш код, так что любой дополнительный символ, который может привести к ошибкам, удален. Давайте посмотрим на следующий код, который помогает нам объединить базу и относительные пути без присутствия любой дополнительно-слеш.

Решение:

from bs4 import BeautifulSoup
import urllib.request
from urllib.parse import urljoin
import requests

web_url = 'https://sayonshubham.github.io/'
headers = {"User-Agent": "Mozilla/5.0 (CrKey armv7l 1.5.16041) AppleWebKit/537.36 (KHTML, like Gecko) "
                         "Chrome/31.0.1650.0 Safari/537.36"}
# get() Request
response = requests.get(web_url, headers=headers)
# Store the webpage contents
webpage = response.content
# Check Status Code (Optional)
# print(response.status_code)
# Create a BeautifulSoup object out of the webpage content
soup = BeautifulSoup(webpage, "html.parser")
for i in soup.find_all('nav'):
    for url in i.find_all('a'):
        # extract the href string
        x = url['href']
        # remove the extra forward-slash if present
        if x[0] == '/':       
            print(web_url + x[1:])
        else:
            print(web_url+x)

Выход:

https://sayonshubham.github.io/
https://sayonshubham.github.io/about
https://sayonshubham.github.io/blog
https://sayonshubham.github.io/finxter
https://sayonshubham.github.io/

⚠️ Осторожность: Это не рекомендуемый способ извлечения абсолютного пути с данной HTML-страницы. В ситуациях, когда у вас есть автоматический скрипт, который необходимо разрешить URL, но на момент написания сценария, вы не знаете, какой веб-сайт ваш скрипт посещает, в этом случае этот метод не будет служить вашим целям и выйти – это метод будет использовать Urlljoin Отказ Тем не менее, этот метод заслуживает упомянуго, потому что в нашем случае он успешно служит цели и помогает нам извлечь абсолютные URL-адреса.

Вывод

В этой статье мы узнали, как извлечь абсолютные ссылки с данной HTML-страницы, используя BeautifulSoup. Если вы хотите овладеть концепциями библиотеки Pythons Beautifulsoup и погрузиться в глубокие концепции вместе с примерами и видео уроками, пожалуйста, посмотрите на следующую ссылку и следуйте за статьями один за другим, где вы найдете каждый аспект Beautificsoup подробности.

Ссылка на статью: веб-соскоб с красивой В питоне

Видеоуправление: Веб соскоб с красивой В питоне

С этим мы дойдем до конца этого учебника! Пожалуйста, Оставайтесь настроиться и Подписаться Для более интересного содержания в будущем.

Я профессиональный Python Blogger и Content Creator. Я опубликовал многочисленные статьи и создал курсы в течение определенного периода времени. В настоящее время я работаю полный рабочий день, и у меня есть опыт в областях, таких как Python, AWS, DevOps и Networking.

Вы можете связаться со мной @: