использование селена для отображения «следующих» результатов поиска с использованием ссылок jscript _doPostBack - PullRequest
0 голосов
/ 04 марта 2019

В результатах поиска на сайте jobquest (http://jobquest.detma.org/JobQuest/Training.aspx), Я хотел бы использовать селен, чтобы щелкнуть ссылку «следующая», чтобы загрузить следующую таблицу результатов из 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()

Step3 : Теперь на странице результатов поиска я создаю суп и "find_all", чтобы получить правильные строки

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

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

На этом этапе я могу получить свои данные (идентификаторы заданий) с первой страницырезультаты с использованием объекта row, например:

id_list=[]

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

ВОПРОС - Step4 Help !! Чтобы перезагрузить таблицу со следующими 20 результатами, я должен нажать на ссылку «Далее» в результатах.Я использовал Chrome для проверки и получил следующие данные:

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

Мне нужен код, чтобы программно нажать Далее и переделать суп со следующими 20 записями.Я ожидаю, что, если бы я мог понять это, я мог бы выяснить, как зациклить код, чтобы получить все ~ 1515 идентификаторов в базе данных.

ОБНОВЛЕНИЕ Строка, которая работала для меня, предложилав ответ:

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

Спасибо, это было очень полезно.

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете использовать атрибут = селектор значения , чтобы нацелиться на href.В этом случае я использую подстроку в конце с помощью оператора содержимого (*).

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

Вы сами решаете, что делать с извлечением информации о строках с каждой страницы.Это должно было дать вам простую структуру для зацикливания всех страниц.

...