Как вытащить название ссылки из href?

112
01 апреля 2022, 18:30

Есть сайт со списком фильмов, название каждого - ссылка. Как спарсить само название если оно находится в href?

import requests 
from bs4 import BeautifulSoup as bs
headers = {'accept': accept,'user-agent':user-agent}
base_url = url
def parse (base_url, headers):
    session = requests.Session()
    request = session.get(base_url, headers = headers)
    if request.status_code == 200:
        soup = bs(request.content, 'html.parser')
        divs = soup.find_all('div', attrs = {'class': 'lister-item mode- 
 advanced'})
        for div in divs:
            name = div.find('a', attrs = {'href': ???}).text
            print(name)
    else: 
        print('ERROR')
parse(base_url, headers)

Для наглядности, выглядит это вот так:

Answer 1
Если нужно парсить содержимое (текст) ссылки

Попробуйте вот такое решение, основанное на возможности BS возвращать список объектов, который соответствует универсальному селектору.

import requests 
from bs4 import BeautifulSoup as bs
headers = {'accept': accept,'user-agent':user-agent}
base_url = url
def parse (base_url, headers):
    session = requests.Session()
    request = session.get(base_url, headers = headers)
    if request.status_code == 200:
        soup = bs(request.content, 'html.parser')
        divs = soup.select('div.lister-item.mode-advanced')
        for div in divs:
            links = div.select('a') # читать примечание после кода
            name = links[0].text if links else '' # если в div этого типа может быть только одна ссылка (если их больше - остальные проигнорируются)
            # name = ', '.join([link.text for link in links]) # если в div этого типа может быть несколько ссылок, так можно получить все их названия через запятую
            # name = [link.text for link in links] # а вот так можно получить все названия всех ссылок, но уже в виде списка
    else: 
        print('ERROR')
parse(base_url, headers)

Примечание:
Если нужно выбирать какие-то конкретные ссылки (например, только начинающиеся с https://), можно также преобразовать селектор таким образом:

...
links = div.select('a[href^="https://"]')
...

Подробнее о селекторах по атрибутам можно почитать тут

Если нужно парсить адрес ссылки

Как спарсить само название если оно находится в href?

Если же вы всё-таки имели в виду парсинг href, то ссылку можно получать следующим образом:

import requests 
from bs4 import BeautifulSoup as bs
headers = {'accept': accept,'user-agent':user-agent}
base_url = url
def parse (base_url, headers):
    session = requests.Session()
    request = session.get(base_url, headers = headers)
    if request.status_code == 200:
        soup = bs(request.content, 'html.parser')
        divs = soup.find_all('div', attrs = {'class': 'lister-item mode-advanced'})
        for div in divs.find_all('a', href=True):
            name = div['href']
            print("Найдена ссылка:", name)
    else: 
        print('ERROR')
parse(base_url, headers)

Источник

READ ALSO
Точность замера выполения программы

Точность замера выполения программы

Требуется замерить программу с высокой точностью и не через библиотеку Chrono, так как требуется строгая мерка выполнения подключаемой библиотеки...

191
Перечисление USB-устройств

Перечисление USB-устройств

Понадобилось написать программу, выполняющую функцию подобно утилите Linux - lsusbВывод должен быть похож на:

109
Выравнивание структуры

Выравнивание структуры

Есть структура _dem_ram_data_Она должна занимать в памяти 16 байт, но я получаю 21 байт

97