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

Я довольно новичок в 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, но не в моей реальной программе (возможно, из-за какой-то очевидной ошибки, которую я не вижу).Любая помощь будет оценена.

1 Ответ

0 голосов
/ 05 мая 2019

Как уже упоминалось в комментариях, используется 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)
...