soup.find_all и find_elements_by_class не возвращают найденные элементы

#python #selenium #findall

#python #селен #найти все

Вопрос:

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

Вот код:

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd

PATH = "C:Program Files (x86)chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://www.optibet.lv/sport/wcg/CS:GO-5541")

odds = driver.find_elements_by_class('event-block-row__odd event-block-row__odd_clickable event-block-row__odd_without-middle-odd')

if odds is not None:
    print('found odds element')
    print(odds)
  

Это не сработало. Он просто печатает «найденный элемент odds». Затем я попытался изменить имя класса odds = driver.find_elements_by_class('odd__value') на безрезультатно.
После этого я попытался использовать BeautifulSoup:

 from selenium import webdriver
from bs4 import BeautifulSoup

url = "https://www.optibet.lv/sport/wcg/CS:GO-5541"
driver = webdriver.Chrome()
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')

containers = soup.find_all("div", class_="event-block-row__odd event-block-row__odd_clickable event-block-row__odd_without-middle-odd")
print (len(containers))
  

Это возвращает ‘0’. У меня нет идей и я не очень опытен. Любая помощь?

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

1. Все находится в iframe.

2. @arundeep chohan Теперь я понимаю, спасибо.

3. Я помещаю ответ, если вы хотите взглянуть.

Ответ №1:

Переключитесь на iframe перед получением класса. Затем выполните цикл по списку.

 driver.get("https://www.optibet.lv/sport/wcg/CS:GO-5541")
driver.implicitly_wait(10)
driver.switch_to.frame(driver.find_element_by_css_selector("#iFrameResizer0"))
odds = driver.find_elements_by_class_name('odd__value')

if odds is not None:
    print('found odds element')
    for odd in odds:
        print(odd.text)
  

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

1. Это делает свое дело. Спасибо. Как вы поняли, что это было внутри iframe, просто посмотрев на него?

2. Первое, что вы делаете при проверке xpath, имен классов, — это проверить, является ли это iframe. Если это iframe, вы, как правило, будете пытаться найти слишком много элементов, и ни один из них не будет успешным.

Ответ №2:

Многие сайты имеют защиту от скребков, и, во-вторых, ваш сайт очень тяжелый. Вы можете попробовать это, но BeautifulSoup имеет ограничения:

 from bs4 import BeautifulSoup
import urllib.request
import bs4 as bs

url_1 = 'https://www.optibet.lv/sport/wcg/CS:GO-5541'
sauce_1  = urllib.request.urlopen(url_1).read()
soup_1 = bs.BeautifulSoup(sauce_1, 'lxml')

for table in soup_1.find('div', class_='event-block-row__odd event-block-row__odd_clickable event-block-row__odd_without-middle-odd'):
    print(table.text)
  

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

1. Я надеюсь, что это поможет, но я не могу открыть сайт, потому что он слишком тяжелый…

2. Да, спасибо. Вот почему я переключился на selenium. Даже с помощью user agent я получил ошибку 403, используя bs. Я считаю, что это можно сделать как с помощью selenium, так и BeautifulSoup, но придерживаться предыдущего будет проще. Еще раз спасибо! 🙂

3. Хорошо, можете ли вы оставить лайк, пожалуйста? 🙂

4. Я сделал, но он не будет отображаться, потому что моя репутация слишком низкая, извините.