Синтаксический разбор текста и 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)
# '  <title>Программирование на Python<title>\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:

Программа для скачивания статей и вырезания (любых) [скобок]

Ссылки