Соскоб Python с использованием Selenium: нажмите на следующую страницу - PullRequest
0 голосов
/ 05 марта 2019

Я ищу способ сделать несколько операций по очистке веб-страниц с помощью Python 3 и с помощью Selenium. На некоторых страницах, представляющих интерес, есть стрелки, указывающие на следующую страницу. Здесь - пример веб-сайта.

Как видно, есть несколько стрелок влево и вправо, указывающих на предыдущую / следующую страницу. Вот скриншот того, о чем я говорю:

enter image description here

Я пытался использовать Inspect в браузере Chrome, но не смог найти элемент, связанный со стрелками, чтобы перемещаться по разным страницам.

Я хотел бы знать, какой элемент связан с этим действием.

Кроме того, есть ли более простой способ очистки всех страниц, кроме использования Selenium?

Ответы [ 4 ]

1 голос
/ 05 марта 2019

Вы можете использовать имена классов в css selector

driver.find_element_by_css_selector('.pager-pagenextb').click()

HTML:

enter image description here

Вы также можете захотеть, чтобы ожидаемые условия ждали кликабельным

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".pager-pagenextb"))).click()

дополнительный импорт для ожидания

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
0 голосов
/ 05 марта 2019

Для перехода на следующую страницу кнопки вы можете использовать класс CSS:

driver.find_element_by_class_name("next_page")

Для очистки используйте BeautifulSoup и requests:

import requests
from bs4 import BeautifulSoup

headers = {
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'DNT': '1',
}

params = (
    ('id', '20412'),
    ('groupby', 'Election Year'),
    ('sortdir', 'descending'),
)

response = requests.post('https://www.nae.edu/default.aspx', headers=headers, params=params)
page = BeautifulSoup(response.text, "html.parser")

__VIEWSTATE = page.find(attrs={"id": "__VIEWSTATE"}).attrs["value"]
__VIEWSTATEGENERATOR = page.find(attrs={"id": "__VIEWSTATE"}).attrs["value"]
__EVENTVALIDATION = page.find(attrs={"id": "__EVENTVALIDATION"}).attrs["value"]
last_page = int(page.select_one(".pager-pageddl option:last-child").text)

for i in range(0, last_page - 1):
    if i > 0:
        __VIEWSTATE = page.find(attrs={"id": "__VIEWSTATE"}).attrs["value"]
        __VIEWSTATEGENERATOR = page.find(attrs={"id": "__VIEWSTATE"}).attrs["value"]
        __EVENTVALIDATION = page.find(attrs={"id": "__EVENTVALIDATION"}).attrs["value"]

        data = {
            '__EVENTTARGET': 'ctl07$ctl07$ctl00$MembersList$members$ctl01$ctl21$filterTopPager$lbNext',
            '__VIEWSTATE': __VIEWSTATE,
            '__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
            '__EVENTVALIDATION': __EVENTVALIDATION,
            'ctl07$ctl07$ctl00$MembersList$members$ctl01$ctl20$filterTopPager$ddlPageIndex': str(i),
            'ctl07$ctl07$ctl00$MembersList$members$ctl01$ctl20$filterTopPager$ddlPageSize': '20',
            'ctl07$ctl07$ctl00$MembersList$members$ctl01$ctl21$filterBottomPager$ddlPageIndex': str(i),
            'ctl07$ctl07$ctl00$MembersList$members$ctl01$ctl21$filterBottomPager$ddlPageSize': '20'
        }

        response = requests.post('https://www.nae.edu/default.aspx', headers=headers, params=params, data=data)
        page = BeautifulSoup(response.text, "html.parser")

    names = page.select(".flexible-list-item .initialState .name")
    for name in names:
        print(name.text)
0 голосов
/ 05 марта 2019

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

element=WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH ,"//a[@class='next_page']")))
element.click()

Если щелчок WebDriver не работает, попробуйте JS executor нажать на элемент.

element=WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH ,"//a[@class='next_page']")))      
driver.execute_script("arguments[0].click();", element)

Вам необходимо импортировать следующее.

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
0 голосов
/ 05 марта 2019

Это путь x правой (следующей) стрелки.Right next arrow

//[@id="ctl07_ctl07_ctl00_MembersList_members_ctl01_ctl20_filterTopPager_lbNext"]

теперь вы можете использовать

driver.find_element_by_xpath('//*[@id="ctl07_ctl07_ctl00_MembersList_members_ctl01_ctl20_filterTopPager_lbNext"]').click()

Если это не работает, вы можете попробовать реализовать драйверWait

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".pager-pagenextb")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...