#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()
insideif
для отображения только одного элемента.
Ответ №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