Есть ли способ заставить selenium предоставлять мне только сегодняшние данные?

#python #selenium #selenium-webdriver

#python #selenium #selenium-webdriver

Вопрос:

Я пытаюсь создать скрипт, который сообщает мне уровни прилива за день, используя selenium но он выдает мне все данные за всю неделю. Как мне заставить его выдавать мне только сегодняшние данные?

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 
import time
import datetime
driver = webdriver.Chrome('/Users/judeslater/Downloads/chromedriver')
driver.get('https://magicseaweed.com/Nosara-Surf-Report/445/Tide/')


WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="msw-js-tide-list"]')))


Day_of_Week = datetime.datetime.today().weekday()

Break_Key = Day_of_Week   1

element = driver.find_elements_by_id('msw-js-tide-list')

intDay = datetime.date(year=2000, month=12, day=1).weekday()
days = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]

def contains_word(string, target):
    return target in string

   

for value in element:
    Ocean_Data = value
    print(Ocean_Data.text)
    time.sleep(1)
    if contains_word(str(Ocean_Data), days[Break_Key]) == True:
       break
    else:
        continue
    break
    

driver.quit()
  

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

1. Вы хотите, чтобы фильтрация выполнялась на стороне selenium или на python?

2. какой бы способ ни сработал

3. Тогда просто используйте filter () для элемента

4. не могли бы вы привести мне пример?

5. возможно, вам следует использовать print() inside if для отображения только одного элемента.

Ответ №1:

У вас много ошибок, но главное — это ваш

 find_elements_by_id('msw-js-tide-list')
  

который дает вам таблицу со всеми днями в виде одного элемента.

Вам следует использовать более сложную xpath с /div в конце, чтобы получать каждый день в виде отдельного элемента — и тогда вы сможете его отфильтровать.

 find_elements_by_xpath('//*[@id="msw-js-tide-list"]/div')
  

Вам не нужно добавлять 1 в Day_of_Week , потому что python начните индексирование с 0

Если вы хотите получить завтрашний день, тогда лучше используйте

 tomorrow = today   datetime.timedelta(days=1)
  

или используйте modulo для перехода к 0 , когда вы получите 7

 Break_Key = (Day_of_Week   1) % 7
  

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 
import time
import datetime

days = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]

today = datetime.datetime.today()
#tomorrow = today   datetime.timedelta(days=1)
#day_of_week = tomorrow.weekday()
day_of_week = today.weekday()
selected_day = days[day_of_week]


driver = webdriver.Chrome('/Users/judeslater/Downloads/chromedriver')
#driver = webdriver.Firefox()
driver.get('https://magicseaweed.com/Nosara-Surf-Report/445/Tide/')

WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="msw-js-tide-list"]')))

all_days = driver.find_elements_by_xpath('//*[@id="msw-js-tide-list"]/div')

for ocean_data in all_days:
    if selected_day in ocean_data.text:
        print(ocean_data.text)
        break

driver.quit()
  

Если вам нужны сегодняшние данные, то, вероятно, они всегда будут в таблице первого дня, чтобы вы могли использовать all_days[1] без проверки selected_day

Там спрятан div в HTML, поэтому я должен использовать [1] вместо этого [0] , чтобы получить сегодняшние данные.

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 
import time
import datetime

driver = webdriver.Chrome('/Users/judeslater/Downloads/chromedriver')
#driver = webdriver.Firefox()
driver.get('https://magicseaweed.com/Nosara-Surf-Report/445/Tide/')

WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="msw-js-tide-list"]')))

all_days = driver.find_elements_by_xpath('//*[@id="msw-js-tide-list"]/div')

ocean_data = all_days[1] # there is one hidden `div` which I have to skip to get today's data
print(ocean_data.text)

driver.quit()
  

Я могу сделать то же самое, используя [2] in xpath (потому что python индексирование начинается с 0 , но xpath начинается с 1 ) и используя find_element_... без символа s в word element , чтобы получить только один результат

 ocean_data = driver.find_element_by_xpath('//*[@id="msw-js-tide-list"]/div[2]')
print(ocean_data.text)
  

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 
import time
import datetime

driver = webdriver.Chrome('/Users/judeslater/Downloads/chromedriver')
#driver = webdriver.Firefox()
driver.get('https://magicseaweed.com/Nosara-Surf-Report/445/Tide/')

WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="msw-js-tide-list"]')))

ocean_data = driver.find_element_by_xpath('//*[@id="msw-js-tide-list"]/div[2]')
print(ocean_data.text)

driver.quit()
  

Ответ №2:

 for value in element:
  

Вместо этого цикла for почему бы просто не использовать element[0], поскольку вам нужен только первый элемент этого списка (‘msw-js-tide-list’), который дает сегодняшнюю дату.

 Ocean_Data = element[0]
print(Ocean_Data.text)
time.sleep(1)
if contains_word(str(Ocean_Data), days[Break_Key]) == True:
   break