#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