как зациклить страницы, используя красивый суп 4 и питона и селена? - PullRequest
0 голосов
/ 24 июня 2019

Я довольно новичок в Python и впервые использую красивый суп, хотя у меня есть некоторый опыт работы с селеном. Я пытаюсь почистить веб-сайт ("http://cbseaff.nic.in/cbse_aff/schdir_Report/userview.aspx") для всех номеров филиалов.

Проблема в том, что они на нескольких страницах (20 результатов на 1, всего: 21 000+ результатов)

Итак, я хотел бы проанализировать их в каком-то цикле, который может повторяться на следующей странице, проблема с URL-адресом веб-страницы не меняется и, следовательно, здесь нет шаблона.

Ладно, для этого я попробовал, лист Google метод импорта HTML / Import XML, но из-за большого количества проблем он просто зависает. Затем я попробовал python и начал читать о чистке с использованием python (я делаю это впервые :)) Кто-то на этой платформе предложил метод

( Python Requests / BeautifulSoup доступ к нумерации страниц )

Я пытаюсь сделать то же самое, но без особого успеха.

Кроме того, чтобы получить результат, который мы должны сначала выполнить, запросим строку поиска с ключевым словом «a» ->, затем нажмите «поиск». Только тогда сайт покажет результат.

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by  import By
import time

options = webdriver.ChromeOptions()
options.add_argument("headless")
driver = webdriver.Chrome(executable_path=r"C:\chromedriver.exe",options=options)

driver.get("http://cbseaff.nic.in/cbse_aff/schdir_Report/userview.aspx")
#click on the radio btn
driver.find_element(By.ID,'optlist_0').click()

time.sleep(2)

# Search the query with letter A And Click Search btn
driver.find_element(By.ID,'keytext').send_Keys("a")
driver.find_element(By.ID,'search').click()

time.sleep(2)

next_button = driver.find_element_by_id("Button1")
data = []
try:
    while (next_button):    
        soup = BeautifulSoup(driver.page_source,'html.parser')
        table = soup.find('table',{'id':'T1'}) #Main Table
        table_body = table.find('tbody') #get inside the body
        rows = table_body.find_all('tr') #look for all tablerow
        for row in rows:            
            cols = row.find_all('td')  # in every Tablerow, look for tabledata
                for row2 in cols:
                    #table -> tbody ->tr ->td -><b> --> exit loop. ( only first tr is our required data, print this)

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

1 Ответ

0 голосов
/ 24 июня 2019

Незначительное дополнение к коду в вашем цикле while:

next_button = 1 #Initialise the variable for the first instance of while loop

while next_button:
    #First scroll to the bottom of the page
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
    #Now locate the button & click on it
    next_button = driver.find_element(By.ID,'Button1')
    next_button.click()
    ###
    ###Beautiful Soup Code : Fetch the page source now & do your thing###
    ###
    #Adjust the timing as per your requirement
    time.sleep(2)

Обратите внимание на тот факт, что важна прокрутка вниз страницы, в противном случае появится ошибка, требующая элемента Button1.скрыто под нижним колонтитулом.Таким образом, с помощью скрипта (в начале цикла) браузер переместится вниз к нижней части страницы.Здесь он может ясно видеть элемент Button1.Теперь найдите элемент, выполните действие щелчка, а затем пусть ваш красивый суп вступит во владение.

...