@AnKus

Парсинг на Python. Как спарсить ссылки с карточек на сайте?

В личных целях нужно спарсить сайт. Уперся в вытаскивание ссылок и почты (нужно, чтоб данные были пригодны для дальнейшей работы с ними).
Вот что есть:

import lxml
import requests
from bs4 import BeautifulSoup
import csv

CSV = "companys.csv"
HOST = 'https://www.ua-region.com.ua'
URL = 'https://www.ua-region.com.ua/ru/kved/47.11'
HEADERS = {
    "Accept": "*/*",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0"
}

def get_html(url, params=''):
    r = requests.get(url, headers=HEADERS, params=params)
    return r

def get_content(html):
    soup = BeautifulSoup(html, 'lxml')
    items = soup.find_all(class_="cart-company-lg d-flex flex-wrap rounded mb-3 border")
    company = []

    for item in items:
        company.append(
            {
                "title":item.find(class_="cart-company-lg__title ui-title-inner").get_text(),
                "link":item.find(class_="cart-company-lg__list-link text-body font-weight-400"),
                "adres":item.find(class_="cart-company-lg__list-link").get_text(),
                "phone":item.find("a", class_="text-nowrap").attrs['href'],
                "mail":item.find(attrs={"target": "_blank"}),
                "subtitle":item.find(class_="col-12 mt-mb-0").get_text()
            }
        )

    return company


def save_data(items, path):
    with open(path, "w", newline="") as file:
        writer = csv.writer(file, delimiter=";")
        writer.writerow(["Name", "Link", "Adres", "Phone", "Mail", "Subtitle"])
        for item in items:
            writer.writerow([item["title"], item["link"], item["adres"], item["phone"], item["mail"], item["subtitle"]])



def parser():
    PAGINATION = input("Кол-во страниц: ")
    PAGINATION = int(PAGINATION.strip())
    html = get_html(URL)
    if html.status_code == 200:
        companys = []
        for start_page in range(1, PAGINATION+1):
            print(f"Pasce page: {start_page}")
            html = get_html(URL, params={"start_page": start_page})
            companys.extend(get_content(html.text))
            save_data(companys, CSV)
        pass

    else:
        print("Error")

parser()


Все вытаскивается нормально, кроме линков и мейлов. Они в таком виде:
span class="cart-company-lg__list-link text-body font-weight-400">https://mokoshaua.com/ , https://www.facebook.com/MokoshaCheese , https://www.instagram.com/mokosha_cheese/

a href="mailto:mokosha@i.ua" target="_blank">mokosha@i.ua

Не понимаю, почему в "link":item.find(class_="cart-company-lg__list-link text-body font-weight-400"), # get('href') возвращает None. Вроде не должен бы ...

Почитал про скрипт JS добавление mailto. Но как его в данный контекст прикрутить не понимаю.

Спасибо
  • Вопрос задан
  • 200 просмотров
Пригласить эксперта
Ответы на вопрос 1
YOin
@YOin
Data Analyst
"link":item.find(class_="cart-company-lg__list-link text-body font-weight-400")

Этот кусок получает класс span в котором есть тег "a" в котором хранится нужная вам ссылка
А у спана ссылки нет, у спана есть тег.
Если быть более конкретным, вам нужно закончить начатое
href = item.find('span', class_ = 'cart-company-lg__list-link text-body font-weight-400')
href.find('a').get('href')

или в одну строчку
href = item.find('span', class_ = 'cart-company-lg__list-link text-body font-weight-400').find('a').get('href')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы