Connect with us

Обучение

Заметки Python #12: Регулярные выражения в Web

353

 

Применим уже полученный опыт с регулярными выражениями, при работе с кодом HTML

Работаем с HTML

С помощью регулярных выражений можно работать с исходным кодом страницы сайта — HTML. Например, можно спарсить погоду со страницы Яндекса. Для начала сделаем это обычным, «механическим» способом. Откроем главную страницу Яндекса и увидим всем знакомый виджет погоды

Чтобы посмотреть в Google Chrome исходный код страницы, можно использовать горячие клавиши CTRL+U. Он откроется в новом окне. Обычным поиском (ctrl+f) ищем нужный нам виджет (на скрине выше — другой город, поэтому погода изменилась на +3)

Для удобства скопируем код в отдельный файл main.html в нашей среде разработки. Теперь мы можем обращаться к коду из pycharm (или кто что использует). Теперь можно прочитать и спарсить нужную нам часть кода с помощью регулярных выражений, т.е. будем «вытаскивать» вот эту часть

<a classhome-link home-link_black_yes weather__grade» aria-label+3 °C, ясно» href=»https://yandex.ru/pogoda/moscow» data-statlogweather.grade» data-statlog-showed1«>

Пишем код. Вместо +3 °C нам нужно подставить свой шаблон, ведь погода будет всегда меняться.

[adace-ad id=»3470″]

 

[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]

 

Результат:

Парсинг текста

С помощью регулярных выражений можно спарсить весь текст на странице, вырезав всё ненужное — тэги, комментарии, в общем, весь служебный код. Как это сделать?

[adace-ad id=»3473″]

 

[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]

 

Результат:

Нажмите что бы оставить комментарий

Ответить

Ваш адрес email не будет опубликован.

Лучшие сервисы стриминга музыки в 2019 году

Сервисы

Телевидение Wink Ростелеком: Samsung LG, Sony, Phillips, Android TV

Ростелеком

Ноутбуки Asus не видят жесткий диск. Автоматический вход в BIOS при старте

Гаджеты

LG WEB OS: приложения, обновления, настройка, проблемы со звуком

Гаджеты

Advertisement Яндекс.Метрика

Digital2.ru - Тренды, Профессии IT, WEB- разработка, Вакансии, Автоматизация, Цифровая экономика
Свободное копирование и распространение материалов с сайта Digital2.ru
разрешено только с указанием активной ссылки на Digital2 как на источник.
Copyright 2018 - 2020 © All rights reserved

OPGIO.COM

Connect