【发布时间】:2021-05-23 14:47:30
【问题描述】:
使用 Selenium (3.141)、BeautifulSoup (4.7.9) 和 Python (3.79),我试图了解给定电影/节目的流媒体、租赁和购买选项。我花了几个小时试图解决这个问题,所以任何帮助将不胜感激。就在 cmet 中的混合和之前的尝试而言,格式不佳表示歉意。
示例链接:https://www.justwatch.com/us/tv-show/24
Desired Outcome 是一个漂亮的汤元素,然后我可以解析它(例如,哪些流媒体服务拥有它,有多少季节可用等), 它有 3 个元素(截至目前)——Hulu、IMDB TV 和 DirecTV。
我尝试了许多变体,但只获得了示例链接的 3 种流媒体服务之一,即便如此,结果也不一致。通常,我得到一个空对象。
我尝试过的一些事情包括等待预期条件(存在或可见性),显式使用时间库中的 sleep()。我使用的是 Mac(但通过 USB 运行 Linux),所以物理键盘上没有“PAGE DOWN”。对于键模块,我尝试了 control+arrow down、page down 和空格(空格键),但在这个特定的网页上它们不起作用。但是,如果我以正常方式浏览它,控制 + 向下箭头和空格键有助于将所需部分滚动到视图中。据我所知,在 Keys 中没有 fn + 向下箭头选项,但这是我可以以正常方式移动的另一种方式。
我已经运行了 headless 和常规选项来尝试调试,并尝试了 Firefox 和 Chrome 驱动程序。
这是我的代码:
import time
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
firefox_options = Options()
firefox_options.add_argument('--enable-javascript') # double-checking to make sure that javascript is enabled
firefox_options.add_argument('--headless')
firefox_driver_path = 'geckodriver'
driver = webdriver.Firefox(executable_path=firefox_driver_path, options=firefox_options)
url_link = 'https://www.justwatch.com/us/tv-show/24'
driver.get(url_link) # initial page
cookies = driver.get_cookies()
我围绕这部分代码尝试的示例
各种 time.sleep(3) 和 driver.implicitly_wait(3) 命令 webdriver.ActionChains(driver).key_down(Keys.CONTROL).key_down(Keys.ARROW_DOWN).perform() webdriver.ActionChains(driver).key_down(Keys.SPACE).perform()
此代码在使用时会产生超时错误
stream_results = WebDriverWait(驱动程序, 15) stream_results.until(EC.presence_of_element_located( (By.CLASS_NAME, "price-comparison__grid__row price-comparison__grid__row--stream")))
page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html.parser') # 'lxml' didn't work either
这是获取与流服务相关的 html 的代码。我还尝试在树的各个级别、ID 和类中获取 html 代码,但代码不存在
stream_row = soup.find('div', attrs={'class':'price-comparison__grid__row price-comparison__grid__row--stream'})
stream_row_holder = soup.find('div', attrs={'class':'price-comparison__grid__row__holder'})
stream_items = stream_row_holder\
.find_all('div', attrs={'class':'price-comparison__grid__row__element__icon'})
driver.quit()
【问题讨论】:
标签: selenium selenium-webdriver beautifulsoup