2016-12-09 5 views
0

diese Appreciate ist bereits hier viele Zeit gefragt, aber ich kann es scheinen, um für mich zu arbeiten.Python Screen Scraping Seite Schleife

Ich habe einen Schaber geschrieben, die erfolgreich alles, was ich von der ersten Seite der Website benötigen kratzt. Aber ich kann nicht herausfinden, wie man es durch die verschiedenen Seiten führt.

Die URL erhöht einfach wie diese BLAH/3 + 'page = x'

Ich habe sehr lange, um Code zu lernen, so dass jede Beratung geschätzt würde nicht!

import requests 
from bs4 import BeautifulSoup 


url = 'http://www.URL.org/BLAH1/BLAH2/BLAH3' 

soup = BeautifulSoup(r.content, "html.parser") 

# String substitution for HTML 
for link in soup.find_all("a"): 
"<a href='>%s'>%s</a>" %(link.get("href"), link.text) 

# Fetch and print general data from title class 
general_data = soup.find_all('div', {'class' : 'title'}) 


for item in general_data: 
    name = print(item.contents[0].text) 
    address = print(item.contents[1].text.replace('.','')) 
    care_type = print(item.contents[2].text) 

Update:

r = requests.get('http://www.URL.org/BLAH1/BLAH2/BLAH3') 

for page in range(10): 

    r = requests.get('http://www.URL.org/BLAH1/BLAH2/BLAH3' + 'page=' + page) 

soup = BeautifulSoup(r.content, "html.parser") 
#print(soup.prettify()) 


# String substitution for HTML 
for link in soup.find_all("a"): 
    "<a href='>%s'>%s</a>" %(link.get("href"), link.text) 

# Fetch and print general data from title class 
general_data = soup.find_all('div', {'class' : 'title'}) 


for item in general_data: 
    name = print(item.contents[0].text) 
    address = print(item.contents[1].text.replace('.','')) 
    care_type = print(item.contents[2].text) 

Update 2 !:

import requests 
from bs4 import BeautifulSoup 

url = 'http://www.URL.org/BLAH1/BLAH2/BLAH3&page=' 

for page in range(10): 

r = requests.get(url + str(page)) 

soup = BeautifulSoup(r.content, "html.parser") 

# String substitution for HTML 
for link in soup.find_all("a"): 
    print("<a href='>%s'>%s</a>" % (link.get("href"), link.text)) 

# Fetch and print general data from title class 
general_data = soup.find_all('div', {'class' : 'title'}) 

for item in general_data: 
    print(item.contents[0].text) 
    print(item.contents[1].text.replace('.','')) 
    print(item.contents[2].text) 
+0

einen Blick in diese Antwort Nehmen http://stackoverflow.com/questions/40809017/scrapy-scraping-links-found-while-scraping/40810840#40810840 Wenn diese dowsn't Hilfe Sie uns wissen lassen. – daniboy000

+0

zu Schleife brauchen Sie 'while' oder' for' - jetzt haben Sie es nicht. – furas

+0

@ daniboy000 - Entschuldigung, ich kann das nicht mit meinen vergleichen! : s – Maverick

Antwort

1

Um Schleife Seiten mit page=x müssen Sie for Schleife wie dieser>

import requests 
from bs4 import BeautifulSoup 

url = 'http://www.housingcare.org/housing-care/results.aspx?ath=1%2c2%2c3%2c6%2c7&stp=1&sm=3&vm=list&rp=10&page=' 

for page in range(10): 

    print('---', page, '---') 

    r = requests.get(url + str(page)) 

    soup = BeautifulSoup(r.content, "html.parser") 

    # String substitution for HTML 
    for link in soup.find_all("a"): 
     print("<a href='>%s'>%s</a>" % (link.get("href"), link.text)) 

    # Fetch and print general data from title class 
    general_data = soup.find_all('div', {'class' : 'title'}) 

    for item in general_data: 
     print(item.contents[0].text) 
     print(item.contents[1].text.replace('.','')) 
     print(item.contents[2].text) 

Jede Seite sein kann Unterschiedliche und bessere Lösung benötigt mehr Informationen über die Seite. Manchmal kann man Link zur letzten Seite bekommen und dann können Sie diese Informationen benutzen, statt 10 in range(10)

Oder können Sie while True Schleife verwenden und break Schleife zu verlassen, wenn es keine Verbindung zur nächsten Seite. Aber zuerst müssen Sie diese Seite (URL zu realer Seite) in Frage stellen.


EDIT: Beispiel, wie Link zur nächsten Seite zu bekommen und dann erhalten Sie alle Seiten - nicht nur 10 Seiten, wie in früheren Version.

import requests 
from bs4 import BeautifulSoup 

# link to first page - without `page=` 
url = 'http://www.housingcare.org/housing-care/results.aspx?ath=1%2c2%2c3%2c6%2c7&stp=1&sm=3&vm=list&rp=10' 

# only for information, not used in url 
page = 0 

while True: 

    print('---', page, '---') 

    r = requests.get(url) 

    soup = BeautifulSoup(r.content, "html.parser") 

    # String substitution for HTML 
    for link in soup.find_all("a"): 
     print("<a href='>%s'>%s</a>" % (link.get("href"), link.text)) 

    # Fetch and print general data from title class 
    general_data = soup.find_all('div', {'class' : 'title'}) 

    for item in general_data: 
     print(item.contents[0].text) 
     print(item.contents[1].text.replace('.','')) 
     print(item.contents[2].text) 

    # link to next page 

    next_page = soup.find('a', {'class': 'next'}) 

    if next_page: 
     url = next_page.get('href') 
     page += 1 
    else: 
     break # exit `while True` 
+0

besser setzen Sie sich in Frage - es kann lesbarer sein und jeder wird es sehen (und kann antworten) – furas

+0

Danke @furas. Das ist es, was ich jetzt sehe, aber es scheint nicht zu funktionieren. r = requests.get (url + Seite) r = requests.get ('http://www.URL.org/BLAH1/BLAH2/BLAH3?page=') # url nächste Seite Suppe = BeautifulSoup (r.content, "html.parser") url = 'http://www.URL.org/BLAH1/BLAH2/BLAH3?page=' für Seite im Bereich (10): # 10 Seiten erhalten r = requests.get (url + page) – Maverick

+0

Ich füge ein Beispiel hinzu, das einen Link zur nächsten Seite findet und es anstelle von 'for-loop' verwendet – furas