【问题标题】:Can't find Element with Selenium找不到带有硒的元素
【发布时间】:2018-11-26 16:36:44
【问题描述】:

我正在尝试使用 Selenium 从 Google 航班网站上取消航班的价格,但该元素不会显示在任何地方,即使在抓取整个页面时也不显示。我读过这可能是因为它位于不同的框架中,但我怎么知道它在哪个框架中。

这里是网站:https://www.google.es/flights?lite=0#flt=/m/0h3tv./m/05qtj.2018-12-14;c:EUR;e:1;a:FR;sd:1;t:f;tt:o

我要找的价格是:32 欧元

这是我的代码:

from bs4 import BeautifulSoup as soup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")

d = webdriver.Chrome('/Users/davidgarciaballester/Desktop/chromedriver', options=chrome_options)

url='https://www.google.es/flights?lite=0#flt=/m/0h3tv./m/05qtj.2018-12-14;c:EUR;e:1;a:FR;sd:1;t:f;tt:o'
d.get(url)



precios = soup(d.page_source, 'html.parser').findAll('jsl',{'jstcache':'9322'})


print(precios)

d.quit();

我错过了什么吗?提前致谢。

编辑 1:jstcache 将值更改为 9322

【问题讨论】:

  • 你得到了什么?
  • 无数据,列表为空。
  • 你确定是 precios = soup(d.page_source, 'html.parser').findAll('jsl',{'jstcache':'9383'}) 吗?我将其视为 9322
  • 你说得对,自从我上次看到它之后,这个数字就变了。不过没关系,即使刮掉整个页面,我也看不到数字。
  • 这个数字很可能是动态生成的,这意味着它不是检索元素的可靠方法。您需要元素的常量属性,每次页面加载时都可以引用该属性。

标签: python html python-3.x selenium web-scraping


【解决方案1】:

您可以使用以下 CSS 选择器组合:

from selenium import webdriver

d = webdriver.Chrome()
d.get("https://www.google.es/flights?lite=0#flt=/m/0h3tv./m/05qtj.2018-12-14;c:EUR;e:1;a:FR;sd:1;t:f;tt:o")
item = d.execute_script("return document.querySelector('.flt-subhead1.gws-flights-results__price.gws-flights-results__cheapest-price span + jsl')")
print(item.text)
d.quit()

【讨论】:

  • 感谢您的回答!正如 Idlehands 指出的那样,这个数字可能会发生动态变化,因此在这种情况下,CSS seelctor 可能是最好的。我已经试用了您的代码,但它似乎没有检索任何数据。
  • 我的号码不匹配。我在位置上匹配。但是为什么它没有检索到任何东西很奇怪。
  • 现在可以了。或者更确切地说,它一直在工作,我有一个语法错误。现在才意识到。谢谢!
  • 很高兴听到 :-)
  • 很棒的方法@QHarr。
【解决方案2】:
from bs4 import BeautifulSoup as soup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options



d = webdriver.Chrome('C:\chromedriver_win32\chromedriver.exe')

url='https://www.google.es/flights?lite=0#flt=/m/0h3tv./m/05qtj.2018-12-14;c:EUR;e:1;a:FR;sd:1;t:f;tt:o'
d.get(url)

page = soup(d.page_source, 'html.parser')

precios = page.findAll('jsl',{'jstcache':'9322'})

print(precios)

d.quit();

为我工作:

print (precios[0].text)

给我€32

【讨论】:

  • 仍然不适合我。复制您的确切代码并更改 webdriver 路径,仍然没有结果。其他页面工作正常,所以它不是我的计算机的问题。
  • 啊好的。良好的睡眠/等待时间。很高兴它现在可以工作了。
【解决方案3】:

好的,弄清楚发生了什么。我没有给驱动程序足够的时间来加载页面。通过在加载页面后停顿几秒钟来解决此问题。

工作代码:

from bs4 import BeautifulSoup as soup
from selenium import webdriver
import time
from selenium.webdriver.chrome.options import Options



d = webdriver.Chrome('C:/Users/David/Desktop/chromedriver.exe')

url='https://www.google.es/flights?lite=0#flt=/m/0h3tv./m/05qtj.2018-12-14;c:EUR;e:1;a:FR;sd:1;t:f;tt:o'
d.get(url)

time.sleep(5)

page = soup(d.page_source, 'html.parser')

precios = page.findAll('jsl',{'jstcache':'9322'})

print(precios)

d.quit()

编辑 1: 正如 Idlehands 指出的那样,jstcache 数字可能是动态的,并且会随着时间而变化,因此这种方法没有经过深思熟虑。相反,我现在使用 QHarr 建议的以下 CSS 选择器组合。工作代码:

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

whitelist = set('abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789')

chrome_options = Options()
chrome_options.add_argument("--headless")

d = webdriver.Chrome('C:/Users/David/Desktop/chromedriver.exe', options=chrome_options)

url='https://www.google.es/flights?lite=0#flt=/m/0h3tv./m/05qtj.2018-12-14;c:EUR;e:1;a:FR;sd:1;t:f;tt:o'
d.get(url)

time.sleep(2)

precio = d.execute_script("return document.querySelector('.flt-subhead1.gws-flights-results__price.gws-flights-results__cheapest-price span + jsl')").text
precio = ''.join(filter(whitelist.__contains__, precio))

print(precio)

d.quit()

【讨论】:

  • time.sleep() 是一个糟糕的解决方案...使用 WebDriverWait
  • 同意 sleep() 是个坏主意,除非您只需要一个快速而肮脏的解决方案来处理不会长期运行的脚本,而且稳定性和速度不是问题。跨度>
  • 好的,我正在研究 WebDriverWait。谢谢朋友们的建议!
  • 很抱歉问了这么多,但我一直在尝试 WebDriverWait,但我似乎无法让它工作。我已经阅读了几个教程并尝试了几个小时,我认为我得到的最接近的是: WebDriverWait(d, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".gws-flights-results__cheapest-price gws- flight-results__price"))) 有人能指出我缺少什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 2021-08-17
  • 2020-08-17
相关资源
最近更新 更多