Есть ли способ использовать select.one на bs4 с функцией «или»

#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)  

Выход

 Νεφελώδης