How can I get href links from HTML using Python?
But I want only href links from the plain text HTML. How can I solve this problem?
10 Answers 10
In case you just want links starting with http:// , you should use:
In Python 3 with BS4 it should be:
You can use the HTMLParser module.
The code would probably look something like this:
Using BS4 for this specific task seems overkill.
I found this nifty piece of code on http://www.pythonforbeginners.com/code/regular-expression-re-findall and works for me quite well.
I tested it only on my scenario of extracting a list of files from a web folder that exposes the files\folder in it, e.g.:
and I got a sorted list of the files\folders under the URL
My answer probably sucks compared to the real gurus out there, but using some simple math, string slicing, find and urllib, this little script will create a list containing link elements. I test google and my output seems right. Hope it helps!
Using requests with BeautifulSoup and Python 3:
![]()
This is way late to answer but it will work for latest python users:
Don’t forget to install «requests» and «BeautifulSoup» package and also «lxml«. Use .text along with get otherwise it will throw an exception.
«lxml» is used to remove that warning of which parser to be used. You can also use «html.parser» whichever fits your case.
![]()
Here’s a lazy version of @stephen’s answer
This answer is similar to others with requests and BeautifulSoup , but using list comprehension.
Because find_all() is the most popular method in the Beautiful Soup search API, you can use soup(«a») as a shortcut of soup.findAll(«a») and using list comprehension:
Simplest way for me:
![]()
-
The Overflow Blog
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.3.11.43304
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Как с помощью в Python извлечь все ссылки на веб‑сайты

Извлечение всех ссылок на веб-странице — обычная задача для веб-парсеров, полезно создавать продвинутые парсеры, которые сканируют каждую страницу определенного веб-сайта для извлечения данных, его также можно использовать для процесса диагностики SEO или даже на этапе сбора информации для проникновения. тестеры. В этом руководстве я расскажу, как с нуля на Python создать инструмент для извлечения ссылок, используя только запросы и библиотеки BeautifulSoup.
Откроем новый файл Python и импортируем необходимые нам модули:
Мы собираемся использовать colorama только для использования разных цветов при печати, чтобы различать внутренние и внешние ссылки:
Нам понадобятся две глобальные переменные, одна для всех внутренних ссылок сайта, а другая для всех внешних ссылок:
- Внутренние ссылки — это URL-адреса, которые ведут на другие страницы того же веб-сайта.
- Внешние ссылки — это URL-адреса, которые ведут на другие веб-сайты.
Поскольку не все ссылки в тегах привязки (теги) действительны (я экспериментировал с этим), некоторые из них являются ссылками на части веб-сайта, некоторые — javascript, поэтому давайте наишем функцию для проверки URL-адресов:
Здесь проверяем наличие в URL-адресе правильной схемы (протокола, например http или https) и имени домена.
Теперь создадим функцию для возврата всех действительных URL-адресов веб-страницы:
Во-первых, инициализирована переменную urls набора URL-адресов, использован set Python, так-как нам не нужны лишние повторяющиеся ссылки.
Во-вторых, извлекается доменное имя из URL-адреса, которое понадобится для проверки полученных ссылок, на предмет внешних или внутренних.
В третьих, загружен HTML-контент веб-страницы, который обернул объектом soup для облегчения синтаксического анализа HTML.
Итак, мы получаем атрибут href и проверяем, есть ли там что-нибудь. В противном случае мы просто переходим к следующей ссылке.
Поскольку не все ссылки являются абсолютными, нам нужно будет объединить относительные URL-адреса с его доменным именем (например, когда href равен «/search», а url равен «google.com», результатом будет «google.com/search»):
Теперь нам нужно удалить параметры HTTP GET из URL-адресов, поскольку это приведет к избыточности в наборе, приведенный ниже код для этого:
В сухом остатке всё, что здесь сделано и проверяется:
- Если URL-адрес недействителен, перейдём к следующей ссылке.
- Если URL-адрес уже находится в internal_urls , нам он уже не нужен.
- Если URL-адрес является внешней ссылкой, распечатаем её серым цветом и добавив в наш глобальный набор external_urls , перейдём к следующей ссылке.
Наконец, после всех проверок URL будет внутренней ссылкой, распечатываем её и добавляем в наши наборы urls и internal_urls .
Вышеупомянутая функция будет захватывать только ссылки одной конкретной страницы, что, если мы хотим извлечь все ссылки всего веб-сайта? Сделаем это:
Эта функция сканирует веб-сайт, что означает, что она получает все ссылки первой страницы, а затем рекурсивно вызывает себя, чтобы перейти по всем ранее извлеченным ссылкам. Однако это может вызвать некоторые проблемы, программа будет зависать на крупных веб-сайтах (на которых есть много ссылок), таких как google.com, поэтому, добавлен параметр max_urls для выхода, когда мы достигаем определенного количества проверенных URL.
Хорошо, давайте проверим и убедимся, что вы используете это на веб-сайте, на который вы авторизованы, в противном случае я не несу ответственности за любой вред, который вы причиняете.
Тестирую на этом сайте. Тем не менее, я настоятельно рекомендую вам не делать этого, это вызовет много запросов, приведет к переполнению веб-сервера и может заблокировать ваш IP-адрес.
Вот часть вывода:
Тут нужна картинка
После завершения сканирования будет выведено общее количество извлеченных и просканированных ссылок:
Классно, правда? Я надеюсь, что этот рецепт будет вам полезен и вдохновит на создание подобных инструментов с использованием Python.
Я собрал все фрагменты и немного отредактировал код для сохранения найденных URL-адресов в файле, а также для получения URL-адреса из аргументов командной строки функции main, посмотрите содержимое файла link_extractor.py.
Есть некоторые веб-сайты, которые загружают большую часть своего контента с помощью JavaScript, в результате нам нужно вместо этого использовать библиотеку request_html , которая позволяет нам выполнять Javascript с помощью Chromium . Я уже написал для этого сценарий, добавив всего несколько строк (поскольку request_html очень похож на requests ). Вот посмотрите код записанный в файле link_extractor_js.py:
Многократный запрос одного и того же веб-сайта за короткий период времени может привести к тому, что веб-сайт заблокирует ваш IP-адрес. В этом случае вам необходимо использовать прокси-сервер для таких целей.
Если вы хотите вместо этого получать изображения, проверьте это руководство: Как загрузить все изображения с веб-страницы в Python, или, если вы хотите извлечь таблицы HTML, проверьте это руководство.
Учебное пособие по парсингу сайтов на Python

Изучение
Предположим, вы хотите получить информацию с веб-сайта? Скажем, статья с сайта geeksforgeeks или новость, что вы будете делать? Первое, что может прийти вам в голову, — это скопировать и вставить информацию на ваш местный носитель. Но что, если вам нужен большой объем данных ежедневно и как можно быстрее. В таких ситуациях копирование и вставка не работают, и именно здесь вам понадобится веб-скрейпинг.
В этой статье мы обсудим, как выполнять парсинг веб-страниц с помощью библиотеки запросов и библиотеки beautifulsoup в Python.
Модуль запросов
Библиотека запросов используется для выполнения HTTP-запросов к определенному URL-адресу и возвращает ответ. Запросы Python предоставляют встроенные функции для управления как запросом, так и ответом.
Установка
Установка запросов зависит от типа операционной системы, основная команда в любом месте — открыть командный терминал и запустить,
Сделать запрос
Модуль запросов Python имеет несколько встроенных методов для выполнения HTTP-запросов к указанному URI с использованием запросов GET, POST, PUT, PATCH или HEAD. HTTP-запрос предназначен либо для получения данных из указанного URI, либо для отправки данных на сервер. Он работает как протокол запроса-ответа между клиентом и сервером. Здесь мы будем использовать запрос GET.
Метод GET используется для получения информации с заданного сервера с использованием заданного URI. Метод GET отправляет закодированную информацию о пользователе, добавленную к запросу страницы.
Пример: запросы Python, выполняющие запрос GET

Объект ответа
Когда кто-то делает запрос к URI, он возвращает ответ. Этот объект Response в терминах python возвращается с помощью request.method (), являющегося методом — get, post, put и т.д. Response — это мощный объект с множеством функций и атрибутов, которые помогают в нормализации данных или создании идеальных частей кода. Например, response.status_code возвращает код состояния из самих заголовков, и можно проверить, был ли запрос обработан успешно или нет.
Объекты ответа могут использоваться для обозначения множества функций, методов и функций.
Пример: Python запрашивает объект ответа
Библиотека BeautifulSoup
BeautifulSoup используется для извлечения информации из файлов HTML и XML. Он предоставляет дерево синтаксического анализа и функции для навигации, поиска или изменения этого дерева синтаксического анализа.
Установка
Чтобы установить Beautifulsoup в Windows, Linux или любой другой операционной системе, потребуется пакет pip. Чтобы узнать, как установить pip в вашей операционной системе, посмотрите — Установка PIP — Windows || Linux. Теперь запустите следующую команду в терминале.
Проверка веб-сайта
Прежде чем извлекать какую-либо информацию из HTML страницы, мы должны понять структуру страницы. Это нужно сделать для того, чтобы выделить нужные данные со всей страницы. Мы можем сделать это, щелкнув правой кнопкой мыши страницу, которую мы хотим очистить, и выбрав элемент проверки.

После нажатия кнопки проверки откроются инструменты разработчика браузера. Теперь почти все браузеры поставляются с установленными инструментами разработчика, и в этом руководстве мы будем использовать Chrome.

Инструменты разработчика позволяют увидеть объектную модель документа (DOM) сайта. Если вы не знаете о DOM, не беспокойтесь, просто рассмотрите отображаемый текст как HTML-структуру страницы.
Разбор HTML
После получения HTML-кода страницы давайте посмотрим, как проанализировать этот необработанный HTML-код и получить полезную информацию. Прежде всего, мы создадим объект BeautifulSoup, указав парсер, который мы хотим использовать.
Примечание. Библиотека BeautifulSoup построена на основе библиотек синтаксического анализа HTML, таких как html5lib, lxml, html.parser и т. Д. Таким образом, объект BeautifulSoup и указанная библиотека синтаксического анализатора могут быть созданы одновременно.
Пример: Python BeautifulSoup анализирует HTML

Эта информация для нас все еще не полезна, давайте посмотрим на другой пример, чтобы сделать из этого некоторую ясную картину. Попробуем извлечь заголовок страницы.
Поиск элементов
Теперь мы хотели бы извлечь некоторые полезные данные из содержимого HTML. Объект soup содержит все данные во вложенной структуре, которые могут быть извлечены программно. Веб-сайт, который мы хотим очистить, содержит много текста, поэтому теперь давайте очистим весь этот контент. Во-первых, давайте проверим веб-страницу, которую мы хотим очистить.

Поиск элементов по классу
На изображении выше мы видим, что все содержимое страницы находится под блоком div с классом entry-content. Мы будем использовать класс find. Этот класс найдет данный тег с данным атрибутом. В нашем случае он найдет весь div, имеющий class как entry-content. У нас есть весь контент с сайта, но вы можете видеть, что все изображения и ссылки также очищены. Итак, наша следующая задача — найти только контент из проанализированного выше HTML. При повторном просмотре HTML-кода нашего веб-сайта —

Мы видим, что содержимое страницы находится под тегом <p>. Теперь нам нужно найти все теги p, присутствующие в этом классе. Мы можем использовать класс find_all в BeautifulSoup.
Как найти все ссылки на сайте python

Если нужно достать все ссылки на определенной странице с помощью Python, это сделать совсем легко. Разберем такой пример. У нас есть HTML страница:
Первый вариант скрипта такой:
На выходе мы получим:
links what I need
links what I
links what
links
Второй вариант такой (используем модуль re – регулярные выражения):
И результат будет такой:
[‘links what I need’, ‘links what I’, ‘links what’, ‘links’]
