Получение погоды для страны, поместите bs4

#python #web-scraping #beautifulsoup

#python #очистка веб-страниц #beautifulsoup

Вопрос:

Я пытаюсь использовать этот веб-сайт https://www.timeanddate.com/weather / чтобы очистить данные о погоде с помощью BeautifulSoup4, открыв URL как:

 quote_page=r"https://www.timeanddate.com/weather/%s/%s/ext" %(country, place)
  

Я все еще новичок в методах веб-очистки и BS4 , я могу найти нужную мне информацию в источнике страницы (например, в этом поиске мы берем страну как Индию и город как Мумбаи), связанную следующим образом: https://www.timeanddate.com/weather/india/mumbai/ext

Если вы видите исходный код страницы, его нетрудно использовать CTRL F и найти атрибуты информации, такие как «Влажность», «Точка росы» и текущее состояние погоды (если ясно, дождливо и т.д.), Единственное, что мешает мне получить эти данные, — это мои знания BS4 .

Можете ли вы проверить исходный код страницы и написать BS4 методы для получения такой информации, как «Ощущения», «Видимость», «Точка росы», «Влажность», «Ветер» и «Прогноз»?

Примечание: Я уже выполнял упражнение по очистке данных ранее, где мне нужно было получить значение в HTML-теге, например, <tag class="someclass">value</tag> используя `

 a=BeautifulSoup.find(tag, attrs={'class':'someclass'})
a=a.text.strip()`
  

Комментарии:

1. Если вам нужны данные о погоде, почему бы просто не использовать API, подобный openweathermap.org/api ?

2. Это отличный API, спасибо за комментарий. Да, я определенно мог бы использовать более простые API, но основным мотивом этого вопроса было понять, как еще я мог бы использовать beautifulsoup в отношении реальных проблем, а не просто читать документы и просматривать примеры. Однако ссылка, которую вы дали, полезна.

Ответ №1:

Вы могли бы ознакомиться с селекторами css

  import requests
from bs4 import BeautifulSoup as bs
country = 'india'
place = 'mumbai'
headers = {'User-Agent' : 'Mozilla/5.0',
          'Host' : 'www.timeanddate.com'}
quote_page= 'https://www.timeanddate.com/weather/{0}/{1}'.format(country, place) 
res = requests.get(quote_page)
soup = bs(res.content, 'lxml')
firstItem = soup.select_one('#qlook p:nth-of-type(2)')
strings = [string for string in firstItem.stripped_strings]
feelsLike = strings[0]
print(feelsLike)
quickFacts = [item.text for item in soup.select('#qfacts p')]

for fact in quickFacts:
    print(fact)
  

Первый селектор #qlook p:nth-of-type(2) использует селектор идентификатора для указания родительского элемента, затем :псевдокласс CSS n-го типа для выбора второго элемента типа абзаца (p-тег) внутри.

Этот селектор соответствует:

введите описание изображения здесь

Я использую stripped_strings для выделения отдельных строк и доступа к необходимой информации по индексу.


Второй селектор #qfacts p использует селектор идентификатора для родительского элемента, а затем комбинатор-потомок с p селектором типа для указания дочерних элементов тега p. Эта комбинация соответствует следующему:

quickFacts представьте список этих совпадений. Вы можете получить доступ к элементам по индексу.

Комментарии:

1. Спасибо за подробный ответ, но я думаю, вы не видели переменную «res», потому что она говорит, что res не определен (в res.content). Не могли бы вы быстро это исправить? Прямо сейчас я работаю как переводчик, поэтому, если у меня возникнут еще какие-либо проблемы, я просто добавлю их в следующих комментариях, если вы не против!

2. упс… Обновлено. Опасность того, что jupyter запоминает вещи

3. Я использую BeautifulSoup 4.7.1

4. Хахаха, никаких проблем, я использую spyder для python 3.5, кстати. Сработало как нельзя лучше, спасибо. Мне все еще нужно разобраться в методах получения значений из тегов в веб-странице типа ‘lxml’ при открытии ее с помощью BS4; те, которые вы только что использовали (селекторы CSS?). Для меня это было ново, и я хотел бы узнать больше, есть ли у вас какие-либо источники, на которые я могу сослаться, или учебные пособия, которые я могу посмотреть?

5. Перейдите по ссылкам в моем ответе, а также поиграйте с этим . Похожие клипы: google.com/search?client=firefox-b-damp;q=css diner