2016-07-16 13 views
-1

Ich habe ein Skript, das ich geschrieben habe, wo ich Beautiful Soup verwenden, um eine Website für Suchergebnisse zu scrappen. Ich habe es geschafft, die Daten, die ich möchte, über seinen Klassennamen zu isolieren.Wie man durch mehrere Ergebnisseiten iteriert, wenn Web Scraping mit Beautiful Soup

Die Suchergebnisse sind jedoch nicht auf einer einzelnen Seite. Stattdessen sind sie über mehrere Seiten verteilt, also möchte ich sie alle bekommen. Ich möchte, dass mein Skript prüfen kann, ob es eine nächste Ergebnisseite gibt, und sich selbst dort ausführen. Da die Ergebnisse in der Anzahl variieren, weiß ich nicht, wie viele Seiten von Ergebnissen existieren, so dass ich einen Bereich nicht vordefinieren kann, um darüber zu iterieren. Ich habe auch versucht, einen "if_page_exists" Check zu verwenden. Wenn ich jedoch eine Seitenzahl außerhalb der Ergebnisbereiche einstelle, existiert die Seite immer, sie hat nur keine Ergebnisse, aber sie hat eine Seite, die besagt, dass keine Ergebnisse angezeigt werden.

Was ich jedoch festgestellt habe, ist, dass jedes Seitenergebnis einen 'Next' Link hat, der id 'NextLink1' hat und das letzte Seitenergebnis hat dies nicht. Also ich denke, das war die Magie könnte sein. Aber ich weiß nicht, wie und wo ich diesen Check implementieren soll. Ich habe endlose Schleifen und so Sachen bekommen.

Das folgende Skript findet die Ergebnisse für den Suchbegriff 'x'. Hilfe wäre sehr willkommen.

from urllib.request import urlopen 
from bs4 import BeautifulSoup 

#all_letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o","p","q","r","s","t","u","v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] 
all_letters= ['x'] 
for letter in all_letters: 

    page_number = 1 
    url = "https://www.co.dutchess.ny.us/CountyClerkDocumentSearch/Search.aspx?q=nco1%253d2%2526name1%253d" + letter + "&page=" + str (page_number) 
    html = urlopen(url) 
    bsObj = BeautifulSoup(html) 
    nameList = bsObj.findAll("td", {"class":"party-name"}) 

    for name in nameList: 
     print(name.get_text()) 

Auch weiß jemand einen kürzeren Weg, um eine Liste von alphanumerischen Zeichen thata besser als die von Instanziierung i oben im Skript auf Kommentar?

+0

Also im Grunde willst du 'if bsObj.find ('a', id = 'NextLink1'): Seitennummer + = 1'? –

+0

Das Problem ist, dass meine URL erstellt und geparst wird, bevor ich die bsObj instanziiere. Also ich weiß nicht, wie ich die URL ändern kann, nachdem ich diese Prüfung gemacht habe –

+0

Bitte ** nicht erneut Fragen ** [Wie kann ich einen Web-Scraper mehrere Seiten von Suchergebnissen mit Beautiful Soup traversieren?] (Http://stackoverflow.com/questions/38364642/how-can-i-make-a-web-scraper-traverse-multiple-pages-of-search-results-using-bea) –

Antwort

0

Versuchen Sie folgendes:

from urllib.request import urlopen 
from bs4 import BeautifulSoup 


#all_letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o","p","q","r","s","t","u","v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] 
all_letters= ['x'] 
pages = [] 

def get_url(letter, page_number): 
    return "https://www.co.dutchess.ny.us/CountyClerkDocumentSearch/Search.aspx?q=nco1%253d2%2526name1%253d" + letter + "&page=" + str (page_number) 

def list_names(soup): 
    nameList = soup.findAll("td", {"class":"party-name"}) 
    for name in nameList: 
     print(name.get_text()) 

def get_soup(letter, page): 
    url = get_url(letter, page) 
    html = urlopen(url) 
    return BeautifulSoup(html) 

def main(): 
    for letter in all_letters: 
     bsObj = get_soup(letter, 1) 

     sel = bsObj.find('select', {"name": "ctl00$ctl00$InternetApplication_Body$WebApplication_Body$SearchResultPageList1"})  
     for opt in sel.findChildren("option", selected = lambda x: x != "selected"): 
      pages.append(opt.string) 

     list_names(bsObj) 

     for page in pages: 
      bsObj = get_soup(letter, page) 
      list_names(bsObj) 
main() 

In der main() Funktion, von der ersten Seite get_soup(letter, 1) wir und speichern Sie in einer Liste finden Sie die Auswahl von Optionen Werte, die alle Seitenzahlen enthält.

Als Nächstes werden die Seitenzahlen wiederholt, um Daten von den nächsten Seiten zu extrahieren.