Синтаксический разбор текста и Beautiful Soup
Пишем реферат. Пример автоматического составления текста из фрагментов статей Википедии.
Мы просматриваем web-страницы в web-браузере, например, Google Chrome. Исходный текст страниц написан на языке гипертекстовой разметки HTML, Hypertext Markup Language. Его можно просмотреть, нажав в браузере сочетание клавиш Ctrl+U.
html-страницу можно загрузить, не открывая браузер. Будем использовать python и библиотеку urllib. Для загрузки страницы необходим ее адрес в интернете – URL (Uniform Resource Locator), единый указатель ресурса. Его мы сохраним в переменной URL.
Если объявленная переменная не изменяется на протяжении всей программы, она называется константой и ее название пишется заглавными буквами. Если бы адрес страницы менялся, переменную стоило написать строчными буквами.
import urllib.request URL = "https://gvard.github.io/py/" html_bytes = urllib.request.urlopen(URL)
Страница загрузится в виде последовательности байт. Мы можем разделить ее на отдельные строки, найти нужную последовательность байтов, перевести ее в строку:
html_byte_list = html_bytes.readlines() title = html_byte_list[7].decode() print(title) # ' Программирование на Python\r\n'
Искать нужные данные в последовательности байт довольно утомительно. Для этого лучше использовать специальные библиотеки, например, Beautiful Soup. Установка библиотеки: в командной строке выполнить команду
pip install bs4
Программа с использованием Beautiful Soup ищет на странице параграфы с текстом и печатает первые три на экран:
import urllib.request from bs4 import BeautifulSoup # Адрес страницы в Википедии - константа: URL = "https://en.wikipedia.org/wiki/Dinosaur" # Открыть и прочитать исходный код страницы по адресу URL html = urllib.request.urlopen(URL).read() # Перевести скачанную страницу в виде байтовой строки (bytes) в объект BeautifulSoup soup = BeautifulSoup(html, 'html.parser') # Найти все параграфы - содержимое тегов p. ps - список. ps = soup.findAll("p") # Соединить текст первых трех (первые два часто пустые) параграфов статьи text = ps[0].text + ps[1].text + ps[2].text print(text)
Убираем из текста все ссылки:
while "[" in text: br1 = s.find("[") br2 = s.find("]") + 1 text = text[:br1] + text[br2:] print(text)
Мы только что написали подпрограмму: законченный фрагмент кода, который может применяться для любого текста, содержащегося в переменной text. Следующий шаг – составить реферат из текста нескольких статей Википедии. Тогда для каждой статьи можно будет повторить уже написанный код.
Возьмем адреса статей про внутренние планеты Солнечной системы и сохраним их список в переменной URLS:
URLS = [ "https://en.wikipedia.org/wiki/Mercury_(planet)", "https://en.wikipedia.org/wiki/Venus", "https://en.wikipedia.org/wiki/Earth", "https://en.wikipedia.org/wiki/Mars" ]
С русским языком сложнее. Для обработки русских символов в URL будем использовать модуль urllib.parse
import urllib.request import urllib.parse from bs4 import BeautifulSoup WIKI_URL = "https://ru.wikipedia.org/wiki/" ASTEROIDS = ["Церера", "(2)_Паллада", "(3)_Юнона", "(4)_Веста"] URLS = [WIKI_URL + urllib.parse.quote(name) for name in ASTEROIDS] for url in URLS: html = urllib.request.urlopen(url).read() soup = BeautifulSoup(html, 'html.parser') ps = soup.findAll("p") text = ps[0].text while "[" in text: br1 = text.find("[") br2 = text.find("]") text = text[:br1] + text[br2+1:] accent_ind = text.find("́") text = text[:accent_ind] + text[accent_ind+1:] print(text)
Посмотрите видео о том, как «написать» реферат при помощи Python:
Ссылки
- Tutorial: Python Web Scraping Using BeautifulSoup
- Practical Introduction to Web Scraping in Python
Туториал по библиотеке BeautifulSoup4
Парсеры — это программы, которые скачивают из интернета странички и разбирают их на составляющие: заголовок, картинка, текст… С помощью него можно выкачать с сайта гигабайты полезной информации. Библиотека BeautifulSoup4 как раз предназначена для парсинга.
В этой статье вы узнаете как распарсить сайт Франка Сонненберга. Цель: по ссылке на пост вытащить его название, текст и картинку.
Франк Сонненберг — известный американский писатель и коуч. За свои книги он попал в “Топ 100 Американских мыслителей”, а его блог принадлежит списку “Лучшие блоги о лидерстве 21 века”.
Прежде чем начинать…
Для прохождения этого туториала вам понадобятся 3 библиотеки:
$ pip install requests BeautifulSoup4 lxml
Получить страничку поста
Будем парсить пост “Are You Grateful?”. Чтобы распарсить HTML-страничку с постом, сначала нужно её скачать. Это можно сделать с помощью requests , вот статья об этой библиотеке.
import requests url = 'https://www.franksonnenbergonline.com/blog/are-you-grateful/' response = requests.get(url) response.raise_for_status() print(response.text)
Здесь мы просто сделали запрос по ссылке и получили в ответ огромный HTML. Начинаться он будет примерно так:
DOCTYPE html> html lang="en-US"> head > meta charset="UTF-8" /> meta name="viewport" content="width=device-width, initial-scale=1" /> .
Парсинг поста
У вас есть HTML страничка, но как достать оттуда заголовок поста, картинку и текст? Наконец, на сцену выходит BeautifulSoup. Сейчас вы получили HTML из response.text , но это просто строка с HTML кодом. Для работы с библиотекой BeautifulSoup нужно сделать из этой строки HTML-суп:
from bs4 import BeautifulSoup soup = BeautifulSoup(response.text, 'lxml') print(soup.prettify())
В Python-коде суп — это новый объект с кучей возможностей. Например, теперь можно вывести HTML красиво, с отступами, с помощью метода soup.prettify() :
DOCTYPE html> html lang="en-US"> head> meta charset="utf-8"/> meta content="width=device-width, initial-scale=1" name="viewport"/> title> Are You Grateful? .
Супом он называется исторически, вот статья об этом термине. Если вкратце, то на самом деле верстальщики иногда косячат и, например, забывают закрывать теги или оставляют какие-нибудь неисправности. Такой код на HTML стали называть tag soup . Браузеры умеют самостоятельно исправлять какие-то огрехи и делать из такого “супа” нормальный, рабочий HTML. Но если вы скачиваете страничку через requests , то браузер тут ни при чём, и вы получите такой HTML, какой написали верстальщики сайта, со всеми его ошибками.
Для этого и нужна библиотека lxml , она подправит мелкие недочёты, и с ней BeautifulSoup справится даже с очень плохой вёрсткой. В этой строчке вы как раз говорите библиотеке BeautifulSoup использовать lxml :
soup = BeautifulSoup(response.text, 'lxml')
Заголовок поста
Заголовок поста можно легко найти методом супа .find() . Для начала нужно узнать в какой тег этот заголовок обёрнут. В этом помогут инструменты разработчика:
Итак, тег h1 . Вот что вернёт метод .find() :
print(soup.find('h1')) #
Это тоже суп, но уже не со всей HTML-страницей, а только с этим тегом и тегами внутри него. Заголовка поста тут нет: пост называется Are You Grateful? , а такого текста в этом теге нет. Похоже, что это не тот тег , который вы искали. Их на странице несколько и BeautifulSoup4 выдал первый, который нашёл. Это тег , который находится в самом верху страницы:
Как же найти заголовок поста, а не страницы? Можно уточнить запрос: заголовок поста лежит в теге , а тот — в :
Давайте попробуем такой запрос:
title_tag = soup.find('main').find('header').find('h1') print(title_tag) # Are You Grateful?
Тег нашли, а как достать его текст? Всё очень просто:
title_tag = soup.find('main').find('header').find('h1') title_text = title_tag.text print(title_text) # Are You Grateful?
Победа, вы добрались до заголовка поста!
Картинка поста
Картинку можно найти так же: это единственный тег внутри тега . Но давайте попробуем другой подход, найдём её по классу. У картинки есть классы:
У картинки есть 3 класса, они перечислены через пробел:
attachment-post-image size-post-image wp-post-image
Класс attachment-post-image переводится как “Картинка поста”, а значит наверняка он есть только у картинок поста. Вот как найти тег img , у которого есть такой класс:
soup.find('img', class_='attachment-post-image') #
# fortunate, things to be grateful for, why you should be grateful, Frank Sonnenberg" class token comment"># size-post-image wp-post-image" height="400" sizes="(max-width: 800px) 100vw, 800px" # src="https://www.franksonnenbergonline.com/wp-content/uploads/2019/10/image_are-you-grateful.jpg" ...
Тот же .find() , только указали параметр class_ . Нижнее подчёркивание разработчики библиотеки добавили для того, чтобы не было пересечения со словом class из Python, которое используется для создания классов.
Осталось достать адрес картинки, он лежит в аргументе src :
soup.find('img', class_='attachment-post-image')['src'] # https://www.franksonnenbergonline.com/wp-content/uploads/2019/10/image_are-you-grateful.jpg
Домашнее задание
Осталось спарсить текст поста. Сделать это можно одним из способов выше: по классу или тегам, с помощью метода find .
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
Как достать текст из html тега python?
Я уже знаю, что есть либа bs4 но все еще не понимаю как мне достать инфу из тега. Я знаю, что нужная мне информация лежит в теге в классе info, но как мне ее взять? Я пытался полностью прописать до нее путь, начинаю от родиельского класса до нее, и искал с помощью метода .find_all ничего. Как ?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как из элемента html кода достать текст? На selenium webdriver python
Всем привет. Задача открыть главную Яндекса, ввести любое слово (например "Тинькофф"), появится.
Как достать текст из тега ?
Требуется достать текст из следующей строки в html документе: <a href="/home/items">Достать этот.

Как получить текст из html тега?
Ребят, появилась надобность поработать с html или на него. <td></td><td >
Как достать html текст из webBrowser1
Добрый день! Не получается сохранить html текст по следующей ссылке: .
Автоматизируй это!
![]()
7054 / 4559 / 1207
Регистрация: 30.03.2015
Сообщений: 13,132
Записей в блоге: 29
ctepler, укажи сайт где это лежит и приложи код которым ты пытался достать
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как получить значение атрибута HTML тега через bs4 для Python?
У меня есть вот такая функция, которая получает название фильма, ищет этот фильм на КиноПоиске и.

Не знаю, как из html кода достать текст и найти в нём слово
На пересдачу по ООП нужно решить и понять следующую задачу: Поиск в WEB.Search Web).

Вывод текст из html-тега с сайта
Прошу дать пример вывода текста в теге с сайта для программы C#. <html> <ver>123</ver>.
Текст HTML распознавался как просто текст, а не HTML код
Здравствуйте! Подскажите пожалуйста, как сделать так, чтобы HTML текст не распознавался браузером.
Как достать тег content из с помощью bs4 python?
Как мне обнаружить сам отрезок и достать из него содержимое тега content с помощью bs4 soup?
- Вопрос задан более года назад
- 327 просмотров
3 комментария
Простой 3 комментария

from bs4 import BeautifulSoup soup = BeautifulSoup('') meta = soup.meta print(meta['content'])
Ornitier @Ornitier Автор вопроса
Рамис, А можно как-то по тегу property? Просто у меня куча ссылок и он в каждой должен найти эту meta, но content разный.
Ornitier @Ornitier Автор вопроса
Рамис, Спасибо большое, кажется я уже разобрался, но вы помогли!
Решения вопроса 1

igorzakhar @igorzakhar
>>> from bs4 import BeautifulSoup >>> html_chunk = '' >>> soup = BeautifulSoup(html_chunk) >>> desc = soup.find("meta", property="og:description") >>> desc.get("content") 'Студенческая ул., 187, Энгельс, Саратовская область' >>>
Ответ написан более года назад
Комментировать
Нравится 1 Комментировать