Как из тега в python достать текст
Перейти к содержимому

Как из тега в python достать текст

  • автор:

Синтаксический разбор текста и 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 текст по следующей ссылке: .

Автоматизируй это!

Эксперт Python

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 комментария

ramzis

from bs4 import BeautifulSoup soup = BeautifulSoup('') meta = soup.meta print(meta['content'])

Ornitier @Ornitier Автор вопроса

Рамис, А можно как-то по тегу property? Просто у меня куча ссылок и он в каждой должен найти эту meta, но content разный.

Ornitier @Ornitier Автор вопроса

Рамис, Спасибо большое, кажется я уже разобрался, но вы помогли!

Решения вопроса 1

igorzakhar

igorzakhar @igorzakhar

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

Ответ написан более года назад

Комментировать

Нравится 1 Комментировать

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

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