使用selenium使用jscript\u doPostBack链接显示“下一个”搜索结果

2024-10-02 14:27:53 发布

您现在位置:Python中文网/ 问答频道 /正文

在jobquest站点(http://jobquest.detma.org/JobQuest/Training.aspx)的搜索结果中,我想使用selenium单击“next”链接,以便加载包含20条记录的下一个分页结果表。我只能勉强拿到前20个结果。以下是让我走到这一步的步骤:

步骤1:我加载打开的页面。你知道吗

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)

步骤2:我找到“搜索”按钮并单击它以请求无搜索条件的搜索。在此代码之后,搜索结果页面将加载表中的前20条记录:

submit_button = browser.find_element_by_id('ctl00_ctl00_bodyMainBase_bodyMain_btnSubmit')
submit_button.click()

步骤3:现在在搜索结果页面上,我创建了一些soup和“find \u all”以获得正确的行

html = browser.page_source
soup = BeautifulSoup(html, "html.parser")

rows = soup.find_all("tr",{"class":"gvRow"})

此时,我可以使用rows对象从结果的第一页获取数据(作业ID),如下所示:

id_list=[]

for row in rows:
    temp = str(row.find("a"))[33:40]
    id_list.append(temp)

问题-步骤4帮助!! 要重新加载包含下20个结果的表,我必须单击结果页上的“下一步”链接。我用Chrome检查了一下,得到了以下细节:

<a href="javascript:__doPostBack('ctl00$ctl00$bodyMainBase$bodyMain$egvResults$ctl01$ctl08','')">Next</a>

我需要代码以编程方式单击Next并用接下来的20条记录重做soup。我希望如果我能弄明白这一点,我就能弄明白如何循环代码以获取数据库中所有~1515个id。你知道吗

更新 答案中建议的对我有用的一句话是:

WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[href*=ctl08]'))).click()

谢谢,这很有用。你知道吗


Tags: 代码importbrowseridhttphtml记录步骤
1条回答
网友
1楼 · 发布于 2024-10-02 14:27:53

可以使用attribute = value selectorhref为目标。在本例中,我使用末尾的子字符串via contains(*)操作符。你知道吗

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

您可以决定如何从每个页面提取行信息。这是给你一个简单的框架来循环所有的页面。你知道吗

相关问题 更多 >