#python #beautifulsoup
Вопрос:
Поэтому в основном я хочу получить данные и, более конкретно, извлечь текст с веб-сайта, но проблема в том, что то, что я хочу найти, меняет местоположение.Извините,если я плохо это объясняю, я только начал изучать python.
from bs4 import BeautifulSoup import requests url_patra = ("https://weather.com/el-GR/weather/today/l/a8c1d5fa8f854f3e5c626109483f1542b6eb8f29924330ccc44ffc07e3050bd7") html_patra = BeautifulSoup(requests.get(url_patra).content, 'html.parser') patra_prediction = html_patra.select_one("div[class*=CurrentConditions--phraseValue--2Z18W]").text print (patra_prediction)
Моя проблема в том, что иногда это работает с :
patra_prediction = html_patra.select_one("div[class*=CurrentConditions--phraseValue--2Z18W]").text
а иногда и с :
patra_prediction = html_patra.select_one("div[class*=CurrentConditions--precipValue--3nxCj]").text
Я не могу каждый раз менять эту конкретную строку. Итак, мой последний вопрос: есть ли способ использовать функцию «или» или что-то подобное, чтобы, когда 1 строка не находит нужного текста, она использовала 2 строки?
Ответ №1:
Вот скрипт для извлечения с этой веб-страницы того, что вам нужно.
Местоположение, погода, тип ….
from bs4 import BeautifulSoup import requests page_content = requests.get("https://weather.com/el-GR/weather/today/l/a8c1d5fa8f854f3e5c626109483f1542b6eb8f29924330ccc44ffc07e3050bd7").content soup = BeautifulSoup(page_content, 'html.parser') def find_location(): locator = 'div.CurrentConditions--header--27uOE h1.CurrentConditions--location--kyTeL' # CSS locator item = soup.select_one(locator).string print(item) def find_weather(): locator = 'div.CurrentConditions--primary--2SVPh span.CurrentConditions--tempValue--3a50n' weather = soup.select_one(locator).string print(weather) def find_weather_type(): locator = 'div.CurrentConditions--phraseValue--2Z18W' type_of = soup.select_one(locator).string print(type_of) def info(): locator = "div.CurrentConditions--precipValue--3nxCj span" info_text = soup.select_one(locator).string print(info_text) def as_of_time(): locator = "div.CurrentConditions--timestamp--23dfw" as_of = soup.select_one(locator).string print(as_of) find_location() find_weather() find_weather_type() info() as_of_time()
Ответ №2:
функции «или» не существует.
согласно источнику страницы, я мог видеть, что это текущее местоположение.
В основном там должно быть название места.
если пропущено, используйте проверку нулевого значения при извлечении.
if (html_patra.select_one("div[class*=CurrentConditions--phraseValue--2Z18W]").text) is null: loc = "No location" else loc = html_patra.select_one("div[class*=CurrentConditions--phraseValue--2Z18W]").text
Ответ №3:
Я не могу каждый раз менять эту конкретную строку. Итак, мой последний вопрос: есть ли способ использовать функцию «или» или что-то подобное, чтобы, когда 1 строка не находит нужного текста, она использовала 2 строки?
Приятно это знать
[attr*=value]
представляет элементы с атрибутом, значение которого содержит значение подстроки, поэтому на самом деле нет необходимости обрабатывать его условно.
Как это исправить?
Вы близки к решению — просто отбросьте динамическую сгенерированную часть class
:
html_patra.select_one("div[class*=CurrentConditions--phraseValue]").text
Примечание: В качестве альтернативы попробуйте выбрать другой атрибут, который не будет меняться так часто -gt; html_patra.select_one('div[data-testid="wxPhrase"]').text
Пример
from bs4 import BeautifulSoup import requests url_patra = ("https://weather.com/el-GR/weather/today/l/a8c1d5fa8f854f3e5c626109483f1542b6eb8f29924330ccc44ffc07e3050bd7") html_patra = BeautifulSoup(requests.get(url_patra).content, 'html.parser') patra_prediction = html_patra.select_one("div[class*=CurrentConditions--phraseValue]").text print (patra_prediction)
Выход
Νεφελώδης