使用Selenium导航到页面后如何使用BeautifulSoup

时间:2017-05-23 19:21:42

标签: python selenium beautifulsoup

我已成功使用selenium点击网站上的几个页面,现在我需要BeautifulSoup来解析数据。问题是由于某种原因,bs4认为我在上一页,所以我的find_all电话都没有工作。下面是我的代码片段。 calendar_search.click()调用正在加载所需的页面。我做了一个夸张的隐式等待让页面加载。根据之前的SO Q& As,我在下面设置了htmlsoup变量。我抛出另一个隐含的等待好的措施。当我致电prettify时,我可以看到我正在calendar_search.click()之前的页面打印html。如何加载当前页面?谢谢。

calendar_search.click()

browser.implicitly_wait(30)

html = browser.page_source
browser.implicitly_wait(30)
soup = bs4.BeautifulSoup(html, 'html.parser')

print(soup.prettify())

编辑:我尝试了明确的等待(见下文)并打印了异常,尽管有1000秒! Edit2:页面的一部分必须已加载,因为我得到了一个find_all列表的x [0]。但是,我无法复制结果。

try:
    element =  WebDriverWait(browser, 
    1000).until(EC.presence_of_element_located((By.CLASS_NAME, 
    'classname')))
    print("Page is ready!")
except TimeoutException:
    print("Loading took too much time!")

2 个答案:

答案 0 :(得分:2)

由于某些奇怪的原因使用browser.implicitly_wait()无法正常工作,但time.sleep()效果很好。我刚刚将browser.implicitly_wait(30)更改为time.sleep(30),效果非常好。
我使用过镀铬驱动程序。不要忘记将chrome驱动程序放在工作目录中以避免driver not found错误。

import time
from bs4 import BeautifulSoup
from selenium import webdriver

url = "https://www.southwest.com/flight/"
browser = webdriver.Chrome()
browser.get(url)

departure = browser.find_element_by_id("originAirport_displayed")
destination = browser.find_element_by_id("destinationAirport_displayed")

departure.send_keys("Chicago (Midway), IL - MDW")
destination.send_keys("New Orleans, LA - MSY")

button = browser.find_element_by_id("submitButton")
button.click()

time.sleep(30)
html = browser.page_source
soup = BeautifulSoup(html, "lxml")
print(soup.prettify())

browser.save_screenshot(browser.title + ".JPEG")

browser.close()
browser.quit()

修改lxml解析器比html解析器快。在BeautifulSoup的官方documentation中,他们建议使用lxml解析器。

答案 1 :(得分:0)

我想我找到了答案。最后,我为我正在解析的项目选择了不同的类(使用find_all)。 tryexcept语句似乎对程序的工作至关重要,因为页面的不同部分似乎在不同时间加载。这可能是主要的收获。我还是不确定为什么某些类似乎没有加载,即使1000秒传入等待语句。