用硒找不到元素

时间:2018-11-26 16:36:44

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

我正在尝试使用Selenium从Google Flights网站上取消一次航班的价格,但是所说的元素不会显示在任何地方,即使是在整个页面上也没有显示。我已经读到它可能是由于它处于不同的框架中,但是我怎么知道它在哪个框架中。

这是网站: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

3 个答案:

答案 0 :(得分:4)

您可以使用以下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()

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

工作代码:

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()