Как получить ссылку из тега python
Перейти к содержимому

Как получить ссылку из тега python

  • автор:

Python Beautifulsoup Как достать ссылку из тега ?

Почему я не могу спарсить ссылку из тега ? Я делаю вроде всё правильно. Этот вопрос связан с моим предыдущим вопросом. Я хочу, чтобы выдавало ссылку, а выдаёт None. Сам код:

def get_content(html): soup = BeautifulSoup(html, 'html.parser') items = soup.find_all('section', class_='proposition') cars = [] for item in items: titles = None if titles_tag := item.find('div', class_='proposition_title'): if titles_1_tag := titles_tag.find('h3'): titles = titles_1_tag.get_text(strip=True) links = None if links_tag := item.find('section', class_='proposition'): if links_1_tag := links_tag.find('a'): links = links_1_tag.get('href') usd_prices = None if usd_prices_tag := item.find('div', class_='proposition_price'): if usd_prices_1_tag := usd_prices_tag.find('span'): usd_prices = usd_prices_1_tag.get_text(strip=True) cars.append( < 'title': titles, 'link': links, 'usd_price': usd_prices, >) print(cars) 

Проблема в:

links = None if links_tag := item.find('section', class_='proposition'): if links_1_tag := links_tag.find('a'): links = links_1_tag.get('href') 

Если нужно, то скину сайт, на котором я парсю.

Извлечение HTML-строки из объекта bs4 в Python

Извлечение HTML из объекта BeautifulSoup возможно двумя методами: с помощью soup.prettify() , возвращающем отформатированный HTML, и str(soup) , который возвращает неотформатированную строку HTML. На практике это выглядит так:

Скопировать код

from bs4 import BeautifulSoup # Предположим, у нас есть объект BeautifulSoup – 'soup'. print(soup.prettify()) # Отформатированный HTML print(str(soup)) # HTML в виде неотформатированной строки

Детальный разбор

Разберёмся, каким образом можно извлечь содержимое HTML с использованием BeautifulSoup.

Извлечение текста и тегов

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

Скопировать код

# Выведем только текст, исключая теги print(soup.get_text()) # Выведем содержимое конкретного тега print(soup.find('span')) # Как часто вы сталкиваетесь со span в своем "супе"?

Особенности различных методов

Помимо этого, обратите внимание на разницу в работе следующих методов:

  • soup.prettify() добавляет в код переносы строк и отступы для удобства чтения. Он предназначен для создания красивого представления кода.
  • str(soup) возвращает HTML в исходном виде, без дополнительного форматирования. Это, можно сказать, прямолинейный подход.

Обработка специальных символов

Заботьтесь о корректной кодировке, если вы работаете с необычными символами:

Скопировать код

# Преобразуем вывод в кодировку UTF-8 print(soup.prettify().encode('utf-8')) # Готовы к международному формату

Визуализация

Представьте себе строителя (��), который по чертежам (��), представляющим собой объект Beautiful Soup, строит веб-страницу:

Скопировать код

��‍♂️ Строитель: "Хм. Этот чертёж что-то прямо особенное. Понятно, это объект Beautiful Soup!" �� Чертёж: [Объект Beautiful Soup с HTML-элементами и их структурой]

Из строительных материалов получается окончательное здание (��) — это наш HTML-код:

Скопировать код

�� Готовая конструкция: ". " # И вот перед вами — объект Beautiful Soup в виде превосходной HTML-структуры!

Иль простым языком :

Скопировать код

BeautifulSoupObject -> ��‍♂️ -> �� -> 'Готовый HTML'

Это описывает процесс преобразования объекта Beautiful Soup в HTML-код.

Подсказки и советы

Навигация по HTML-структуре

Методы .contents или .children позволят вам навигировать по структуре HTML:

Скопировать код

# Дочерние элементы объекта soup print(soup.contents) # Все дочерние элементы объекта soup, рекурсивно for child in soup.children: print(child) # Когда-нибудь думали, что у супа могут быть дети?

Обращение к атрибутам

Для того чтобы получить атрибуты, вроде id , class или data-атрибуты, используйте синтаксис обращения к словарю:

Скопировать код

# Обращение к атрибуту 'id' первого элемента div print(soup.find('div')['id']) # Ищете ID для div? Вот он!

Обработка неполных тегов

Иногда теги могут быть неполными или вовсе отсутствовать. BeautifulSoup отлично справляется и с такими случаями:

Скопировать код

# Парсинг неполного HTML soup = BeautifulSoup("

Ой, а где закрывающий тег?", 'html.parser') print(soup.prettify()) # Недостающие теги найдены и добавлены.

Работа с комментариями и скриптами

Комментарии и скрипты также можно удалять и обрабатывать:

Скопировать код

from bs4 import Comment # Удаление всех комментариев comments = soup.findAll(text=lambda text: isinstance(text, Comment)) [comment.extract() for comment in comments] # До свидания, комментарии! # Поиск тегов script script_tags = soup.find_all('script') # Если они вам не по душе, просто избавьтесь от них!

Полезные ресурсы

  1. Официальная документация Beautiful Soup — основной источник информации по всем вопросам, связанным с Beautiful Soup.
  2. Учебник по Beautiful Soup: создание веб-скрейпера на Python от Real Python — отличный ресурс для тех, кто хотел бы изучить сбор данных из сети с использованием Beautiful Soup и Python.
  3. Веб-скрапинг с использованием Beautiful Soup и Requests: учебный курс на YouTube от Кори Шафера — видеокурс, в котором детально рассказывается о основах веб-скрапинга и использовании Beautiful Soup.
  4. Практическое руководство по извлечению содержимого HTML с помощью Beautiful Soup на Python от DigitalOcean — с помощью этого руководства вы сможете освоить практическое применение Beautiful Soup.
  5. Статья на Medium о способах извлечения атрибутов, текста и HTML с помощью Beautiful Soup на Towards Data Science — интересное чтение для тех, кто работает с Beautiful Soup.
  6. Краткое руководство по началу работы с Beautiful Soup — полезное руководство для начинающих разработчиков, только начинающих знакомиться с HTML-парсингом.

Как вытащить «src» из тега «img» через BeautifulSoup

Author24 — интернет-сервис помощи студентам

Всем привет. Искал долго, но решения так и не нашёл.
Есть такой код, он выводит все теги img со страницы (по определённым причинам не могу раскрыть сам сайт). Потому что нужно именно все, вне зависимости от класса и месторасположения. Однако у меня не получается вытащить от туда ссылку картинки src, т.к. я новичок и разумеется данный код не то, чтобы сам написал, буду признателен, если в ответе вы укажете код в качестве примера.

import requests from bs4 import BeautifulSoup url = 'какой-то сайт' response = requests.get(url) soup = BeautifulSoup(response.content, 'lxml') images = soup.find_all('img') for image in images: print (images)

Парсинг сайта вместе с Python и библиотекой Beautiful Soup: простая инструкция в три шага

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

Иллюстрация: Катя Павловская для Skillbox Media

Антон Яценко

Антон Яценко
Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.

Для парсинга используют разные языки программирования: Python, JavaScript или даже Go. На самом деле инструмент не так важен, но некоторые языки делают парсинг удобнее за счёт наличия специальных библиотек — например, Beautiful Soup в Python.

В этой статье разберёмся в основах парсинга — вспомним про структуру HTML-запроса и спарсим сведения о погоде с сервиса «Яндекса». А ещё поделимся записью мастер-класса, на котором наш эксперт в веб-разработке покажет, как с нуля написать веб-парсер.

Что такое парсинг и зачем он нужен?

Парсинг (от англ. parsing — разбор, анализ), или веб-скрейпинг, — это автоматизированный сбор информации с интернет-сайтов. Например, можно собрать статьи с заголовками с любого сайта, что полезно для журналистов или социологов. Программы, которые собирают и обрабатывают информацию из Сети, называют парсерами (от англ. parser — анализатор).

Сам парсинг используется для решения разных задач: с его помощью телеграм-боты могут получать информацию, которую затем показывают пользователям, маркетологи — подтягивать данные из социальных сетей, а бизнесмены — узнавать подробности о конкурентах.

Существуют различные подходы к парсингу: можно забирать информацию через API, который предусмотрели создатели сервиса, или получать её напрямую из HTML-кода. В любом из этих случаев важно помнить, как вообще мы взаимодействуем с серверами в интернете и как работают HTTP-запросы. Начнём с этого!

HTTP-запросы, XML и JSON

HTTP (HyperText Transfer Protocol, протокол передачи гипертекста) — протокол для передачи произвольных данных между клиентом и сервером. Он называется так, потому что изначально использовался для обмена гипертекстовыми документами в формате HTML.

Для того чтобы понять, как работает HTTP, надо помнить, что это клиент-серверная структура передачи данных․ Клиент, например ваш браузер, формирует запрос (request) и отправляет на сервер; на сервере запрос обрабатывается, формируется ответ (response) и передаётся обратно клиенту. В нашем примере клиент — это браузер.

Запрос состоит из трёх частей:

  • Строка запроса (request line): указывается метод передачи, версия HTTP и сам URL, к которому обращается сервер.
  • Заголовок (message header): само сообщение, передаваемое серверу, его параметры и дополнительная информация).
  • Тело сообщения (entity body): данные, передаваемые в запросе. Это необязательная часть.

Посмотрим на простой HTTP-запрос, которым мы воспользуемся для получения прогноза погоды:

_GET /https://yandex.com.am/weather/ HTTP/1.1_

В этом запросе можно выделить три части:

  • _GET — метод запроса. Метод GET позволяет получить данные с ресурса, не изменяя их.
  • /https://yandex.com.am/weather/ — URL сайта, к которому мы обращаемся.
  • HTTP/1.1_ — указание на версию HTTP.

Ответ на запрос также имеет три части: _HTTP/1.1 200 OK_. В начале указывается версия HTTP, цифровой код ответа и текстовое пояснение. Существующих ответов несколько десятков. Учить их не обязательно — можно воспользоваться документацией с пояснениями.

Сам HTTP-запрос может быть написан в разных форматах. Рассмотрим два самых популярных: XML и JSON.

JSON (англ. JavaScript Object Notation) — простой формат для обмена данными, созданный на основе JavaScript. При этом используется человекочитаемый текст, что делает его лёгким для понимания и написания:

Для просмотра HTML-кода откроем «Инспектор кода». Для этого можно использовать комбинации горячих клавиш: в Google Chrome на macOS — ⌥ + ⌘ + I, на Windows — Сtrl + Shift + I или F12. Инспектор кода выглядит как дополнительное окно в браузере с несколькими вкладками:

Переключаться между вкладками не надо, так как вся необходимая информация уже есть на первой.

Теперь найдём блок в коде, где хранится значение температуры. Для этого следует последовательно разворачивать блоки кода, располагающиеся внутри тега . Сделать это можно, нажимая на символ ▶.

Как понять, что мы на правильном пути? Инспектор кода при наведении на блок кода подсвечивает на сайте ту область, за которую он отвечает. Переходим последовательно вглубь HTML-кода и находим нужный нам элемент.

В нашем случае пришлось проделать большой путь: элемент с классом «b‑page__container» → первый элемент с классом «content xKNTdZXiT5r0Tp0FJZNQIGlNu xIpbRdHA» → элемент с классом «xKNTdZXiT5r0vvENJ» → элемент с классом «fact card card_size_big» → элемент с классом «fact__temp-wrap xFNjfcG6O4pAfvHM» → элемент с классом «link fact__basic fact__basic_size_wide day-anchor xIpbRdHA» → элемент с классом «temp fact__temp fact__temp_size_s». Именно последнее название класса нам потребуется на следующем шаге.

Шаг 3

Пишем код и получаем необходимую информацию

Продолжаем писать команды в терминал, командную строку, IDE или онлайн-редактор кода Python. На этом шаге нам остаётся использовать подключённые библиотеки и достать значения температуры из элемента . Но для начала надо проверить работу библиотек.

Сохраняем в переменную URL-адрес страницы, с которой мы планируем парсить информацию:

Но весь код нам не нужен — мы должны выводить только тот блок кода, где хранится значение температуры. Напомним, что это . Найдём его значение с помощью функции find() библиотеки Beautiful Soup.

Функция find() принимает два аргумента:

  • указание на тип элемента HTML-кода, в котором происходит поиск;
  • наименование этого элемента.

В нашем случае код будет следующим:

temp = bs.find('span', 'temp__value temp__value_with-unit')

И сразу выведем результат на экран с помощью print:

print(temp)
class="temp__value temp__value_with-unit">+17 

Получилось! Но кроме нужной нам информации есть ещё HTML-тег с классом — а он тут лишний. Избавимся от него и оставим только значения температуры с помощью свойства text:

print(temp.text)

Всё получилось. Мы смогли узнать текущую температуру в городе с сайта «Яндекс.Погода», используя библиотеку Beautiful Soup для Python. Её можно использовать для своих задач — например, передавая в виджет на своём сайте, — или создать бота для погоды.

Скрапинг веб-сайтов с помощью Python — мастер-класс для новичков

Если вы совсем новичок в веб-скрапинге, но хотите написать свой парсер (например, для автоматической генерации отчётов в Excel), рекомендуем посмотреть вебинар от Михаила Овчинникова — ведущего инженера-программиста из Badoo. Он на понятном примере объясняет основы языка Python и принципы веб-скрапинга. Уже в начале видеоурока вы запустите простой парсер и научитесь читать данные в формате HTML и JSON.

Запись вебинара по скрапингу сайтов с помощью Python и библиотеки Beautiful Soup

Парсинг динамических сайтов c помощью Python и библиотеки Selenium

Бесплатная библиотека Selenium позволяет эмулировать работу веб-браузера — то есть «маскировать» веб-запросы скрипта под действия человека в Google Chrome или Safari. Почему это важно? Сайты умеют распознавать ботов и блокируют IP-адреса, с которых отправляются автоматические запросы.

Избежать «бана» можно двумя способами: изучить HTTP, принципы работы Python с вебом и написать свой эмулятор с нуля или воспользоваться готовым инструментом. Во втором случае Selenium — одно из лучших и самых удобных решений.

О том, как работать с библиотекой, рассказал Михаил Овчинников:

Запись вебинара по сбору данных с помощью библиотек Selenium и Beautiful Soup

Резюме

Парсинг помогает получить нужную информацию с любого сайта. Для него можно использовать разные языки программирования, но некоторые из них содержат стандартные библиотеки для веб-скрейпинга, например Beautiful Soup на Python.

А ещё мы рекомендуем внимательно изучить официальную документацию по библиотекам, которые мы использовали для парсинга. Например, можно углубиться в возможности и нюансы использования библиотеки Beautiful Soup на Python.

Читайте также:

  • 3 фреймворка для тестирования на Python: обзор конфигураций
  • 5 шаблонов проектирования, которые должен освоить каждый разработчик
  • Как происходит модульное тестирование в Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *