Применим уже полученный опыт с регулярными выражениями, при работе с кодом HTML
Работаем с HTML
С помощью регулярных выражений можно работать с исходным кодом страницы сайта — HTML. Например, можно спарсить погоду со страницы Яндекса. Для начала сделаем это обычным, «механическим» способом. Откроем главную страницу Яндекса и увидим всем знакомый виджет погоды
Чтобы посмотреть в Google Chrome исходный код страницы, можно использовать горячие клавиши CTRL+U. Он откроется в новом окне. Обычным поиском (ctrl+f) ищем нужный нам виджет (на скрине выше — другой город, поэтому погода изменилась на +3)
Для удобства скопируем код в отдельный файл main.html в нашей среде разработки. Теперь мы можем обращаться к коду из pycharm (или кто что использует). Теперь можно прочитать и спарсить нужную нам часть кода с помощью регулярных выражений, т.е. будем «вытаскивать» вот эту часть
<a class=»home-link home-link_black_yes weather__grade» aria-label=»+3 °C, ясно» href=»https://yandex.ru/pogoda/moscow» data-statlog=»weather.grade» data-statlog-showed=»1«>
Пишем код. Вместо +3 °C нам нужно подставить свой шаблон, ведь погода будет всегда меняться.
[code]
import re
with open(«main.html», «r», encoding=»utf-8″) as f:
code = f.read()
pattetn = re.findall(«(\-?\+?[0-9]) °C», code)
print(pattetn)
[/code]
С помощью регулярных выражений можно работать напрямую с тэгами и атрибутами HTML. В этом примере с погодой, вместо обычного шаблона можно использовать тег a, который обозначает ссылку. Ссылку мы скопируем из исходного кода в хроме
Копируем часть гипертекстовой ссылки и вставляем её на место шаблона. Не забываем при этом ставить обратный слэш на кавычках, иначе программа посчитает это концом шаблона:
[code]
import re
with open(«main.html», «r», encoding=»utf-8″) as f:
code = f.read()
pattetn = re.findall(«<a class=\»home-link home-link_black_yes weather__grade\» aria-label=\»([^\»]+)\» href=», code)
print(pattetn)
[/code]
Парсинг текста
С помощью регулярных выражений можно спарсить весь текст на странице, вырезав всё ненужное — тэги, комментарии, в общем, весь служебный код. Как это сделать?
[code]
import re
with open(«main.html», «r», encoding=»utf-8″) as f:
code = f.read()
# создаем три шаблона с помощью re.compile
comments = re.compile(«<!—.*—!>», re.DOTALL) #конструкция внутри означает — любой символ до момента нахождения —!>
script = re.compile(«<script>.*?</script>») #аналогично комментариям, только указывает тэг скрипта
tags = re.compile(«<[^<]*>») #меньше, затем любой знак кроме меньше, повторенный много раз
code = script.sub(«»,code) # заменяем всё, что в списке script на символ пробела
code = comments.sub(«»,code) # заменяем всё, что в списке comments на символ пробела
code = tags.sub(«»,code) # заменяем всё, что в списке tags на символ пробела
code = re.sub(«[ ]+», » «, code) # пробелы, которые повторяются много раз, заменяем на один пробел
code = re.sub («\s{2,}», «\n», code) # любой пробельный символ, повторенный более двух раз, заменяем на перенос строки
print(code)
[/code]
Библиотека BeutifulSoup
Чтобы работать с HTML-кодом не всегда полезно и правильно использовать встроенные инструменты. Для этого есть специальные библиотеки для Python, которые сильно упрощают взаимодействие с языком разметки. Одна из них — BeutifulSoup. Чтобы её установить достаточно зайти в File -> Settings -> Project (будет написан ваш текущий проект). Ниже выбираем Project Interpreter
Нажимаем «Добавить»
Ищем, выбираем, устанавливаем
Тоже самое проделайте с библиотекой bs4
Чтобы работать с библиотекой, нужно её импортировать обычным нам способом — через import. Для начала попробуем получить разметку обычного HTML-файла. Иногда в source невозможно ничего понять, давайте попробуем привести её в friendly вид или получить текст с помощью метода get_text
[code]
import re
from bs4 import BeautifulSoup as BS
with open(«main.html», «r», encoding=»utf-8″) as f:
code = f.read()
soup = BS (code, «html.parser»)
# print (soup.prettify()) либо приводим в удобночитаемый вид
print (soup.get_text()) #либо получаем только текст
[/code]
С помощью BeautifulSoup можно «выцепить» все ссылки со страницы одной строчкой
[code]
import re
from bs4 import BeautifulSoup as BS
with open(«main.html», «r», encoding=»utf-8″) as f:
code = f.read()
soup = BS (code, «html.parser»)
link = soup.find_all(«a») #находим все ссылки
for links in link:
print(links.get («href», «»))
[/code]



































































