单击按钮加载完整的HTML以使用Selenium加载其他元素

时间:2017-05-29 19:42:55

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

我想抓一页并收集所有链接。该页面显示30个条目,并查看单击加载全部按钮所需的完整列表。

我使用以下代码:

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.PhantomJS()
driver.get('http://www.christies.com/lotfinder/searchresults.aspx?&searchfrom=header&lid=1&entry=edgar%20degas&searchtype=p&action=paging&pg=all')

labtn = driver.find_element_by_css_selector('a.load-all')
labtn.click()

elem = driver.find_element_by_xpath("//*")
source_code = elem.get_attribute("outerHTML")
soup = BeautifulSoup(source_code, 'lxml')

url_list = []
for div in soup.find_all(class_ ='image-container'):
            for childdiv in div.find_all('a'):
                url_list.append(childdiv['href'])
print(url_list)

这是HTML标记

<div class="loadAllbtn">
   <a class="load-all" id="loadAllUpcomingPast" href="javascript:void(0);">Load all</a> 
</div>

我仍然获得原始的30个链接和初始代码。我似乎没有正确使用Selenium并且想知道我做错了什么。

到目前为止,硒工作。安装了Node JS,我设法制作了截图并将其保存到文件中。

1 个答案:

答案 0 :(得分:1)

当您点击“全部加载”时,您会提出额外请求以接收所有项目。您需要等待一段时间才能响应服务器:

from selenium.webdriver.support.ui import WebDriverWait as wait

driver = webdriver.PhantomJS()
driver.get('http://www.christies.com/lotfinder/searchresults.aspx?&searchfrom=header&lid=1&entry=edgar%20degas&searchtype=p&action=paging&pg=all')

labtn = driver.find_element_by_css_selector('a.load-all')
labtn.click()

wait(driver, 15).until(lambda x: len(driver.find_elements_by_css_selector("div.detailscontainer")) > 30)

以上代码应允许您等待最多15秒,直到项目数超过30。然后,您可以使用完整的项目列表来抓取页面源

P.S。请注意,您不需要使用这些代码行

elem = driver.find_element_by_xpath("//*")
source_code = elem.get_attribute("outerHTML")

获取页面源。试试吧

source_code = driver.page_source

P.P.S。此外,您无需使用BeautifulSoup来获取每个项目的链接。你可以这样做

links = [link.get_attribute('href') for link in driver.find_elements_by_css_selector('div.image-container>a')]