python. beautifulsoup. Не получается получить все ссылки со страницы
Не могу вытащить все ссылки на карточки ЖК, получается вытащить только 1 ссылку с помощью find на сайте код выглядит так :
ссылка на саму страницу: https://krasnodar.cian.ru/novostroyki Методом find с уточнением
soup.find('div', class_='class="_0fce717cdb--container--1Gxqr _0fce717cdb--container-background_color--transparent--3pvxk _0fce717cdb--container-display--inline-block--3bIEb").find('a').get('href')
работает и находит необходимую ссылку Но методом find_all не получается добиться нужного результата.
Отслеживать
12.5k 7 7 золотых знаков 19 19 серебряных знаков 48 48 бронзовых знаков
задан 6 апр 2021 в 14:26
13 5 5 бронзовых знаков
имена классов — динамические, там нет одинаковых _0fce717cdb—container—1Gxqr.
6 апр 2021 в 14:59
У вас разные имена классов в ссылках, вот и не получается найти.
6 апр 2021 в 15:13
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
import requests from bs4 import BeautifulSoup url = 'https://krasnodar.cian.ru/novostroyki/' r = requests.get(url) soup = BeautifulSoup(r.content, 'html.parser') cards = soup.find_all('div', ) for card in cards: title = card.find('span', ).text link = card.find('a', )['href'] print(f' ')
выведет на печать:
ЖК «Европейский» https://zhk-evropeyskiy-krasnodar.cian.ru/#map ЖК «Самолет» https://krasnodar.cian.ru/zhiloy-kompleks-samolet-krasnodar-353100/hod-stroitelstva/ ЖК «Сказка град» https://zhk-skazka-grad-krasnodar.cian.ru/hod-stroitelstva/ . ЖК «Резиденция» https://krasnodar.cian.ru/zhiloy-kompleks-rezidenciya-kozhzavod-mkr-7135/hod-stroitelstva/ ЖК «Седьмой континент» https://krasnodar.cian.ru/zhiloy-kompleks-sedmoy-kontinent-krasnodar-8390/otzyvy/ ЖК «Южане» https://krasnodar.cian.ru/zhiloy-kompleks-yuzhane-krasnodar-23921/hod-stroitelstva/
Отслеживать
ответ дан 6 апр 2021 в 16:02
12.5k 7 7 золотых знаков 19 19 серебряных знаков 48 48 бронзовых знаков
Благодарю. Способ помог — немного поправил теги. Понял принцип. Буду тщательнее изучать вопрос.
7 апр 2021 в 10:21
import requests from bs4 import BeautifulSoup as Soup from bs4.element import Tag response = requests.get('https://krasnodar.cian.ru/novostroyki') soup = Soup(response.content, 'html.parser') def link_from_header(header: Tag): a = header.find('a') return a.get('href') link_list = [*map(link_from_header, soup.find_all('div', ))] print(*link_list, sep='\n') # https://zhk-evropeyskiy-krasnodar.cian.ru/ # https://krasnodar.cian.ru/zhiloy-kompleks-samolet-krasnodar-353100/ # https://zhk-skazka-grad-krasnodar.cian.ru/ # https://krasnodar.cian.ru/zhiloy-kompleks-park-pobedy-krasnodar-1686651/ # https://zhk-strizhi-krasnodar.cian.ru/ # https://krasnodar.cian.ru/zhiloy-kompleks-abrikosovo-krasnodar-16066/ # https://krasnodar.cian.ru/zhiloy-kompleks-elegant-krasnodar-8304/ # https://krasnodar.cian.ru/zhiloy-kompleks-dostoyanie-krasnodar-1789905/ # https://zhk-sportivnaya-derevnya-krasnodar.cian.ru/ # https://krasnodar.cian.ru/zhiloy-kompleks-otkrytie-krasnodar-50168/ # https://zhk-gubernskiy-krasnodar.cian.ru/ # https://krasnodar.cian.ru/zhiloy-kompleks-rakurs-krasnodar-1659959/ # https://krasnodar.cian.ru/zhiloy-kompleks-dyhanie-krasnodar-39245/ # https://krasnodar.cian.ru/zhiloy-kompleks-development-plaza-krasnodar-144280/ # https://zhk-sportivnyy-park-krasnodar.cian.ru/ # https://zhk-melodiya-krasnodar.cian.ru/ # https://zhk-solnechnyy-gorod-krasnodar.cian.ru/ # https://krasnodar.cian.ru/zhiloy-kompleks-novella-krasnodar-1706586/ # https://krasnodar.cian.ru/zhiloy-kompleks-svoboda-krasnodar-33666/ # https://krasnodar.cian.ru/zhiloy-kompleks-lime-krasnodar-1276272/ # https://krasnodar.cian.ru/zhiloy-kompleks-serdce-shkolnyy-mkr-47259/ # https://krasnodar.cian.ru/zhiloy-kompleks-grani-krasnodar-48852/ # https://krasnodar.cian.ru/zhiloy-kompleks-rezidenciya-kozhzavod-mkr-7135/ # https://krasnodar.cian.ru/zhiloy-kompleks-sedmoy-kontinent-krasnodar-8390/ # https://krasnodar.cian.ru/zhiloy-kompleks-yuzhane-krasnodar-23921/
Отслеживать
ответ дан 6 апр 2021 в 16:58
6,497 2 2 золотых знака 8 8 серебряных знаков 23 23 бронзовых знака
Благодарю за ответ. Не все понял. но постараюсь разобраться
7 апр 2021 в 10:23
@K1bomax, link_list = [*map(link_from_header, soup.find_all(‘div’, <'data-mark': 'GKCardTitle'>))] Если нужен список ссылок с которым нужно дальше работать'data-mark':>
7 апр 2021 в 12:01
Да я понял. но у меня пока что все идет без функций. решил написать одной простыней. После буду переписывать по человечески.
Извлечение всех ссылок web-сайта с помощью Python

Одна из задач, которая стояла в рамках проекта, нацеленного на исследование мер поисковой оптимизации (SEO, search engine optimization) информационных ресурсов дочерних структур организации, предполагала поиск всех ссылок и выявление среди них так называемых «мертвых (битых) ссылок», отсылающих на несуществующий сайт, страницу, файл, что в свою очередь понижает рейтинг информационного ресурса.
В этом посте я хочу поделиться одним из способов извлечения всех ссылок сайта (внутренних и внешних), который поможет при решении подобных задач.
Посмотрим, как можно создать инструмент извлечения ссылок в Python, используя пакет requests и библиотеку BeautifulSoup. Итак,
pip install requests bs4
Импортируем необходимые модули:
import requests from urllib.parse import urlparse, urljoin from bs4 import BeautifulSoup
Затем определим две переменные: одну для всех внутренних ссылок (это URL, которые ссылаются на другие страницы того же сайта), другую для внешних ссылок вэб-сайта (это ссылки на другие сайты).
# Инициализировать набор ссылок (уникальные ссылки) int_url = set() ext_url = set()
Далее создадим функцию для проверки URL – адресов. Это обеспечит правильную схему в ссылке — протокол, например, http или https и имя домена в URL.
# Проверяем URL def valid_url(url): parsed = urlparse(url) return bool(parsed.netloc) and bool(parsed.scheme)
На следующем шаге создадим функцию, возвращающую все действительные URL-адреса одной конкретной веб-страницы:
# Возвращаем все URL-адреса def website_links(url): urls = set() # извлекаем доменное имя из URL domain_name = urlparse(url).netloc # скачиваем HTML-контент вэб-страницы soup = BeautifulSoup(requests.get(url).content, "html.parser")
Теперь получим все HTML теги, содержащие все ссылки вэб-страницы.
for a_tag in soup.findAll("a"): href = a_tag.attrs.get("href") if href == "" or href is None: # href пустой тег continue
В итоге получаем атрибут href и проверяем его. Так как не все ссылки абсолютные, возникает необходимость выполнить соединение относительных URL-адресов и имени домена. К примеру, когда найден href — «/search» и URL — «google.com» , то в результате получим «google.com/search».
# присоединить URL, если он относительный (не абсолютная ссылка) href = urljoin(url, href)
В следующем шаге удаляем параметры HTTP GET из URL-адресов:
parsed_href = urlparse(href) # удалить параметры URL GET, фрагменты URL и т. д. href = parsed_href.scheme + "://" + parsed_href.netloc + parsed_href.path
Если URL-адрес недействителен/URL уже находится в int_url , следует перейти к следующей ссылке.
Если URL является внешней ссылкой, вывести его и добавить в глобальный набор ext_url и перейдти к следующей ссылке.
И наконец, после всех проверок получаем URL, являющийся внутренней ссылкой; выводим ее и добавляем в наборы urls и int_url
if not valid_url(href): # недействительный URL continue if href in int_url: # уже в наборе continue if domain_name not in href: # внешняя ссылка if href not in ext_url: print(f"[!] External link: ") ext_url.add(href) continue print(f"[*] Internal link: ") urls.add(href) int_url.add(href) return urls
Напоминаю, что эта функция захватывает ссылки одной вэб-страницы.
Теперь создадим функцию, которая сканирует весь веб-сайт. Данная функция получает все ссылки на первой странице сайта, затем рекурсивно вызывается для перехода по всем извлеченным ссылкам. Параметр max_urls позволяет избежать зависания программы на больших сайтах при достижении определенного количества проверенных URL-адресов.
# Количество посещенных URL-адресов visited_urls = 0 # Просматриваем веб-страницу и извлекаем все ссылки. def crawl(url, max_urls=50): # max_urls (int): количество макс. URL для сканирования global visited_urls visited_urls += 1 links = website_links(url) for link in links: if visited_urls > max_urls: break crawl(link, max_urls=max_urls)
Итак, проверим на сайте, к которому имеется разрешение, как все это работает:
if __name__ == "__main__": crawl("https://newtechaudit.ru") print("[+] Total External links:", len(ext_url)) print("[+] Total Internal links:", len(int_url)) print("[+] Total:", len(ext_url) + len(int_url))
Вот фрагмент результата работы программы:

Обратите внимание, что многократный запрос к одному и тому же сайту за короткий промежуток времени может привести к тому, что ваш IP-адрес будет заблокирован. Ссылка на оригинал поста.
Как получить все ссылки на странице сайта?
Как получить все ссылки на странице сайта с помощь командной строки? Или это нужно делать все на питоне? других вариантов нет? Если нет, что не желательно, то каким образом это можно организовать на питоне?
- Вопрос задан более года назад
- 918 просмотров
Комментировать
Решения вопроса 4

Владимир Куц @fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Из командной строки:
curl https://yandex.ru | grep -o -E 'href=\".*?\"' | sed 's/href=\"//' | sed 's/\"//' | sort | uniq # //yandex.ru/opensearch.xml # //yastatic.net/jquery/2.1.4/jquery.min.js # https://afisha.yandex.ru/rostov-na-donu/cinema/cyrano-2022? utm_source=yamain&utm_medium=yamain_afisha_kp # https://afisha.yandex.ru/rostov-na-donu/cinema/dog-2021?utm_source=yamain&utm_medium=yamain_afisha_kp # https://afisha.yandex.ru/rostov-na-donu/cinema/kroletsyp-i-khomiak-tmy?utm_source=yamain&utm_medium=yamain_afisha_kp .
import io import requests from lxml import etree data = requests.get('https://yandex.ru').text parser = etree.HTMLParser() tree = etree.parse(io.StringIO(data), parser) for im in tree.xpath('//a'): print(im.get('href'))
Ответ написан более года назад
Нравится 3 1 комментарий
David It @David138 Автор вопроса
А если допустим страница — медиафал вордперсса, как в ней получить ссылки на загруженные файлы с командной строки?

Например так:
возможно понадобится добавить ключ -usebasicparsing в зависимости от версии powershell
Ответ написан более года назад
Нравится 1 3 комментария
David It @David138 Автор вопроса
Это я так понимаю на Винде. Есть впринципе винда на другой машине. Попробую
ну я не увидел требований что это на линуксе.
curl вполне справляется, с вытаскиванием ссылок — можно взять примеры у двух других отвечающих
David It @David138 Автор вопроса
Евгений, у повершела на букву I неадекватная реакция я смотрю?? не могу команду прописать — Invoke

Если нужно собрать именно линки посмотри в сторону requests-html сделан на базе requests. Фишка в том что может собрать все урлы со страницы и ещё много разных плюшек для ленивых)
Ответ написан более года назад
David It @David138 Автор вопроса
Вопрос ещё в том, а если в админке КМС рассмотреть случай. Например аналог Ворд пресса, без вмешательства админки в кмс, можно вывести ссылки файлов например в разделе медиа через командную строку или через питон?

David It, я не понял твой вопрос. КМС это что? CMS? Раздел медиа это что? Вывести можно все в командной строке или воспользоваться питоном для вывода в терминал.
David It @David138 Автор вопроса
Электо Хаус, да в cms есть раздел медиа, и там например папка и в ней файлы. Как мне вывести ссылки на эти файлы в папке с командной строки или питона?

David It, вариантов масса. Самый простой это зайти на сервак по ssh и сделать что типа ls -a1 /var/www/sitenime/img/foldername/
Тебе выведет список всех файлов по указанному пути. Скопируй и чуть поправь в любом редакторе.
Ещё можно написать скрипт на питоне который выведет тебе данные.
Можно написать более сложный скрипт на сокетах который соединятся и выведет данные.
Если данные доступны из вне на сайте. То можно спарсить их.
Если на сайте есть карта сайта xml можно ее распарсить и забрать нужные линки.
Если данные есть в дб можно запросить их там. Для этого есть тулза у питона. Или воспользоваться средствами ORM
Можно написать скрипт на баш
Можно написать на ps если под виндовс работаешь.
Как ты видишь вариантов масса!
Выбирай подходящий и юзай. Предполагаю ты знаешь питон, для парсинга нужен requests и bs4
Для написания скрипта хватит стандартных модулей питона.
Или ты хочешь получить готовый скрипт?
Python для web
В этом примере мы будем использовать модуль re, для того чтобы получить все ссылки с любого веб-сайта.
Один из самых мощных функций в re модуле является re.findall().
В то время как re.search() используется, чтобы найти первое вхождение удовлетворяющее шаблону, re.findall() находит все вхождения и возвращает их в виде списка строк.
Собираем все ссылки с веб-сайта
Этот пример будет получить все ссылки из любого HTML кода.
Чтобы найти их, мы в этом примере будем использовать модуль urllib2 вместе
с re.module.
import urllib2 import re #производим соединение с URL website = urllib2.urlopen(url) #читаем html код html = website.read() #используем re.findall для парсинга всех ссылок с сайта links = re.findall('"((http|ftp)s?://.*?)"', html) print links