【问题标题】:using selenium to display 'next' search results using jscript _doPostBack links使用 selenium 使用 javascript _doPostBack 链接显示“下一个”搜索结果
【发布时间】:2019-03-04 03:37:33
【问题描述】:

在 jobquest 网站 (http://jobquest.detma.org/JobQuest/Training.aspx) 的搜索结果中,我想使用 selenium 单击“下一步”链接,以便加载下一个分页结果表,其中包含 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:我找到搜索按钮并单击它以请求没有搜索条件的搜索。在此代码之后,搜索结果页面会加载表中的前 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"})

此时,我可以使用这样的 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>

我需要代码以编程方式单击“下一步”并用接下来的 20 条记录重新制作汤。我希望如果我能弄清楚这一点,我就能弄清楚如何循环代码以获取数据库中所有 ~1515 个 ID。

更新 答案中建议的对我有用的行是:

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

谢谢,这很有用。

【问题讨论】:

    标签: python selenium-webdriver web-scraping dopostback


    【解决方案1】:

    您可以使用attribute = value selector 来定位href。在这种情况下,我通过 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
    

    您决定如何处理从每个页面中提取的行信息。这是为了给你一个简单的框架来循环所有的页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 2022-01-18
      相关资源
      最近更新 更多