Не могу добавить ссылку к строке через "+"

Рейтинг: 0Ответов: 1Опубликовано: 27.01.2023

Есть сайт.

Есть код:

all_a = soup.find("ul", class_="projects clearfix pagination-item").find_all("a")
for item in all_a:
  item_url = "https://m-strana.ru" + item.get("href")
  print(item_url)

И ошибка:


https://m-strana.ru/brands/lider-dach/
https://m-strana.ru/brands/lider-dach/
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-35-6a40592ec927> in <module>
     1 all_a = soup.find("ul", class_="projects clearfix pagination-item").find_all("a")
     2 for item in all_a:
----> 3   item_url = "https://m-strana.ru" + item.get("href")
     4   print(item_url)

TypeError: can only concatenate str (not "NoneType") to str

Не пойму, в чем подвох? До этого работало без ошибок. Работает, если убрать https://m-strana.ru.

Ответы

▲ 1Принят

С текущей выборкой вам попался <a> без href

<a class="comparision" data-id="25061"><svg class="icon" xmlns="http://www.w3.org/2000/svg"><use xlink:href="/bitrix/templates/ms_2018/img/icons.svg#comparision"></use></svg></a>

Я бы использовал css-селектор, а ссылку объединял через urljoin и взяв у самого сайта - т.к. сайт мог сделать редирект и в итоге ссылка стала бы другой

Пример:

from urllib.parse import urljoin

import requests
from bs4 import BeautifulSoup


url = 'https://m-strana.ru/brands/karkasnaya-tekhnologiya/'
rs = requests.get(url)
soup = BeautifulSoup(rs.content, 'html.parser')

all_a = soup.select(".projects.clearfix.pagination-item a[href]")
for item in all_a:
    item_url = urljoin(rs.url, item.get("href"))
    print(item_url)

Еще, я заметил, что ссылки там повторяются. Можно ограничить выбор, например, уточнив css-селектор, чтобы найти те <a>, у которых есть класс main-link:

all_a = soup.select(".projects.clearfix.pagination-item a[href].main-link")

введите сюда описание изображения