Вы довольно близки, и вы правы насчет "вам просто нужно немного подождать".
Вы могли бы подождать загрузки страницы: wait_for_page_load
проверяет состояние документа и, если все загружено, тогда вы готовы к go. Проверьте эту тему для получения дополнительной информации. :)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.select import Select
from bs4 import BeautifulSoup
import os
import re
import time
import pandas as pd
def wait_for_page_load():
timer = 10
start_time = time.time()
page_state = None
while page_state != 'complete':
time.sleep(0.5)
page_state = Browser.execute_script('return document.readyState;')
if time.time() - start_time > timer:
raise Exception('Timeout :(')
Chrome_Path = r"C:\Users\George\Desktop\chromedriver.exe"
Browser = webdriver.Chrome()
Browser.get("https://cuetracker.net/seasons")
links = Browser.find_elements_by_css_selector("table.table.table-striped a")
hrefs=[]
for link in links:
hrefs.append(link.get_attribute("href"))
hrefs = hrefs[1:5]
hrefs2 = {}
for href in hrefs:
hrefs2[href] = []
Browser.get(href)
wait_for_page_load()
links2 = Browser.find_elements_by_partial_link_text("20")
for link in links2:
hrefs2[href].append((link.get_attribute("href")))
Несколько замечаний, если вы не возражаете:
Browser
должно быть browser
или driver
, то же самое относится к Chrome_Path
- проверить Xpath, это круто
РЕДАКТИРОВАТЬ:
Я был небрежным в первый раз поэтому я обновил ответ, чтобы ответить на вопрос: D. Ожидание загрузки страницы все еще хорошая идея:)
Проблема заключалась в том, что вы переопределяли hrefs2
в каждом цикле, чтобы он всегда содержал результат последней итерации.
О том, почему xpath:
Если вы хотите загрузить результаты до 2000 , ваш логин сбора URL c сломается. Вы все еще можете сделать это:
table = Browser.find_element_by_xpath('//*[@class="table table-striped"]')
all_urls = [x.get_attribute('href') for x in table.find_elements_by_xpath('.//tr/td[2]/a')]
Где вы найдете таблицу по имени класса, затем соберите URL-адреса из второго столбца таблицы.
Если вы знаете шаблон URL, вы даже можете сделать это:
all_urls = [x.get_attribute('href') for x in Browser.find_elements_by_xpath('//td//a[contains(@href, "https://cuetracker.net/tournaments")]')]
Xpath выше:
//td
<- на любой глубине В дереве документа найдите <code>td теговых элементов //a
<- в собранных <code>td элементах получаются все дочерние элементы, помеченные a
(на любой глубине) [contains(@href, "https://cuetracker.net/tournaments")]
из список собранных теговых элементов a
, которые содержат текст "https://cuetracker.net/tournaments"
в атрибуте href
(частичное совпадение)