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

Я новичок в RegEx (и Python) в целом и пытаюсь использовать его для чтения температуры и описания погоды через HTML-теги веб-сайта.

Для этого я попытался переработать примеры того, что мне показывали в классе и читал в Интернете.

url = 'https://weather.com/en-AU/weather/today/l/-27.47,153.02'
contents = urllib.request.urlopen(url).read().decode("utf-8")

start_of_div = contents.find('<div class="today_nowcard-phrase">') # start of phrase line
end_of_div = start_of_div + contents[start_of_div:].find("</div>") + 6 # close of phrase line

phrase_area = contents[start_of_div:end_of_div]
print(phrase_area)

phrase = phrase_area.rfind(r'>(.*)<') # regex tester says this works
print(phrase)

Затем есть еще один раздел, который получает степени и использует такой же макет. Он должен печатать фразу типа «Солнечно» или «Слабый дождь» или любую другую погоду, а также текущие градусы (по Цельсию). Вместо этого он распечатывает:

<div class="today_nowcard-phrase">Sunny</div>
- 1
<div class="today_nowcard-temp"><span class="">21<sup>
- 1

Вместо -1 должно быть «Солнечно» и «21» (на тот момент). RegEx работает, когда я размещаю его на тестовых сайтах RegEx, но не в моей реальной программе (вероятно, из-за какой-то очевидной ошибки, которую я не вижу). Любая помощь будет оценена по достоинству.


person MonarchNarwhale    schedule 05.05.2019    source источник
comment
str.find не реализует регулярное выражение, он просто ищет литеральную строку. Взгляните на модуль re из стандартной библиотеки для Perl-подобной реализации регулярного выражения.   -  person isaactfa    schedule 05.05.2019
comment
rfind() не использует регулярные выражения. Ваш код ищет буквальную строку >(.*)<, которой, конечно же, нет.   -  person John Gordon    schedule 05.05.2019
comment
Пожалуйста, не используйте RegEx для разбора HTML. Попробуйте html.parser для Python   -  person Tico    schedule 05.05.2019


Ответы (1)


Как уже упоминалось в комментариях, используется парсер html. Все элементы имеют приятные отличительные имена классов, которые вы можете использовать, например. .today_nowcard-temp (где . в начале — это селектор класса css, соответствующий имени класса элемента)

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://weather.com/en-AU/weather/today/l/-27.47,153.02')
soup = bs(r.content, 'html.parser')
temp = soup.select_one('.today_nowcard-temp').text
desc = soup.select_one('.today_nowcard-phrase').text
print(temp, desc)
person QHarr    schedule 05.05.2019