我已成功使用selenium点击网站上的几个页面,现在我需要BeautifulSoup来解析数据。问题是由于某种原因,bs4认为我在上一页,所以我的find_all
电话都没有工作。下面是我的代码片段。 calendar_search.click()
调用正在加载所需的页面。我做了一个夸张的隐式等待让页面加载。根据之前的SO Q& As,我在下面设置了html
和soup
变量。我抛出另一个隐含的等待好的措施。当我致电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!")
答案 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
)。 try
和except
语句似乎对程序的工作至关重要,因为页面的不同部分似乎在不同时间加载。这可能是主要的收获。我还是不确定为什么某些类似乎没有加载,即使1000秒传入等待语句。