使用 selenium 显示 'next' 使用 javascript __doPostBack 链接的搜索结果
using selenium to display 'next' search results using jscript _doPostBack links
求职网站(http://jobquest.detma.org/JobQuest/Training.aspx)的搜索结果中,我想用selenium点击"next"link,以便下一个分页结果table将加载 20 条记录。我只能抓到前 20 个结果。以下是让我走到这一步的步骤:
Step1: 我载入起始页
import requests, re
from bs4 import BeautifulSoup
from selenium import webdriver
browser = webdriver.Chrome('../chromedriver')
url ='http://jobquest.detma.org/JobQuest/Training.aspx'
browser.get(url)
Step2: 我找到搜索按钮并单击它以请求没有搜索条件的搜索。在此代码之后,搜索结果页面加载 table:
中的前 20 条记录
submit_button = browser.find_element_by_id('ctl00_ctl00_bodyMainBase_bodyMain_btnSubmit')
submit_button.click()
第 3 步:现在在搜索结果页面上,我创建了一些汤 "find_all" 以获得正确的行
html = browser.page_source
soup = BeautifulSoup(html, "html.parser")
rows = soup.find_all("tr",{"class":"gvRow"})
此时,我可以使用这样的行对象从结果的第一页获取我的数据(工作 ID):
id_list=[]
for row in rows:
temp = str(row.find("a"))[33:40]
id_list.append(temp)
问题 - 第 4 步求助!!
要使用接下来的 20 个结果重新加载 table,我必须单击结果页面上的 "next" link。我用 Chrome 检查它并得到了这些细节:
<a href="javascript:__doPostBack('ctl00$ctl00$bodyMainBase$bodyMain$egvResults$ctl01$ctl08','')">Next</a>
我需要代码以编程方式单击下一步并用接下来的 20 条记录重新制作汤。我希望如果我能弄清楚这一点,我就能弄清楚如何循环代码以获取数据库中的所有 ~1515 个 ID。
更新
答案中建议的对我有用的行是:
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[href*=ctl08]'))).click()
谢谢,这很有用。
您可以使用 attribute = value selector 来定位 href
。在这种情况下,我通过 contains (*
) operator.
在末尾使用子字符串
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[href*=ctl08]'))).click()
作为预防措施,我添加了等待可点击条件。你或许可以删除它。
额外进口
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
无等待条件:
browser.find_element_by_css_selector('[href*=ctl08]'),click()
另一种方式:
现在,您可以先将页面结果计数设置为 100(最大值),然后循环浏览结果页面的下拉列表以加载每个新页面(这样您就无需考虑如何许多页)
import requests, re
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
url ='http://jobquest.detma.org/JobQuest/Training.aspx'
browser.get(url)
submit_button = browser.find_element_by_id('ctl00_ctl00_bodyMainBase_bodyMain_btnSubmit')
submit_button.click()
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[value="100"]'))).click()
html = browser.page_source
soup = BeautifulSoup(html, "html.parser")
rows = soup.find_all("tr",{"class":"gvRow"})
id_list=[]
for row in rows:
temp = str(row.find("a"))[33:40]
id_list.append(temp)
elems = browser.find_elements_by_css_selector('#ctl00_ctl00_bodyMainBase_bodyMain_egvResults select option')
i = 1
while i < len(elems) / 2:
browser.find_element_by_css_selector('#ctl00_ctl00_bodyMainBase_bodyMain_egvResults select option[value="' + str(i) + '"]').click()
#do stuff with new page
i+=1
您决定如何处理从每个页面中提取的行信息。这是为了给你一个循环所有页面的简单框架。
求职网站(http://jobquest.detma.org/JobQuest/Training.aspx)的搜索结果中,我想用selenium点击"next"link,以便下一个分页结果table将加载 20 条记录。我只能抓到前 20 个结果。以下是让我走到这一步的步骤:
Step1: 我载入起始页
import requests, re
from bs4 import BeautifulSoup
from selenium import webdriver
browser = webdriver.Chrome('../chromedriver')
url ='http://jobquest.detma.org/JobQuest/Training.aspx'
browser.get(url)
Step2: 我找到搜索按钮并单击它以请求没有搜索条件的搜索。在此代码之后,搜索结果页面加载 table:
中的前 20 条记录submit_button = browser.find_element_by_id('ctl00_ctl00_bodyMainBase_bodyMain_btnSubmit')
submit_button.click()
第 3 步:现在在搜索结果页面上,我创建了一些汤 "find_all" 以获得正确的行
html = browser.page_source
soup = BeautifulSoup(html, "html.parser")
rows = soup.find_all("tr",{"class":"gvRow"})
此时,我可以使用这样的行对象从结果的第一页获取我的数据(工作 ID):
id_list=[]
for row in rows:
temp = str(row.find("a"))[33:40]
id_list.append(temp)
问题 - 第 4 步求助!! 要使用接下来的 20 个结果重新加载 table,我必须单击结果页面上的 "next" link。我用 Chrome 检查它并得到了这些细节:
<a href="javascript:__doPostBack('ctl00$ctl00$bodyMainBase$bodyMain$egvResults$ctl01$ctl08','')">Next</a>
我需要代码以编程方式单击下一步并用接下来的 20 条记录重新制作汤。我希望如果我能弄清楚这一点,我就能弄清楚如何循环代码以获取数据库中的所有 ~1515 个 ID。
更新 答案中建议的对我有用的行是:
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[href*=ctl08]'))).click()
谢谢,这很有用。
您可以使用 attribute = value selector 来定位 href
。在这种情况下,我通过 contains (*
) operator.
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[href*=ctl08]'))).click()
作为预防措施,我添加了等待可点击条件。你或许可以删除它。
额外进口
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
无等待条件:
browser.find_element_by_css_selector('[href*=ctl08]'),click()
另一种方式:
现在,您可以先将页面结果计数设置为 100(最大值),然后循环浏览结果页面的下拉列表以加载每个新页面(这样您就无需考虑如何许多页)
import requests, re
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
url ='http://jobquest.detma.org/JobQuest/Training.aspx'
browser.get(url)
submit_button = browser.find_element_by_id('ctl00_ctl00_bodyMainBase_bodyMain_btnSubmit')
submit_button.click()
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[value="100"]'))).click()
html = browser.page_source
soup = BeautifulSoup(html, "html.parser")
rows = soup.find_all("tr",{"class":"gvRow"})
id_list=[]
for row in rows:
temp = str(row.find("a"))[33:40]
id_list.append(temp)
elems = browser.find_elements_by_css_selector('#ctl00_ctl00_bodyMainBase_bodyMain_egvResults select option')
i = 1
while i < len(elems) / 2:
browser.find_element_by_css_selector('#ctl00_ctl00_bodyMainBase_bodyMain_egvResults select option[value="' + str(i) + '"]').click()
#do stuff with new page
i+=1
您决定如何处理从每个页面中提取的行信息。这是为了给你一个循环所有页面的简单框架。