2016-05-20 9 views
1

ich einige Informationen von dieser URL Schaben: https://www.rockethub.com/projects/34210-lunar-lion-the-first-ever-university-led-mission-to-the-moon#description-tabScraping: kann keine Informationen aus Web-Zugriff

Alles war gut, bis ich die Beschreibung abgeschabt. Ich versuchte und versuchte zu kratzen, aber ich scheiterte bisher. Es scheint, als könnte ich diese Information nicht erreichen. Hier ist mein Code:

html = urllib.urlopen("https://www.rockethub.com/projects/34210-lunar-lion-the-first-ever-university-led-mission-to-the-moon") 
tree=BeautifulSoup(html, "lxml") 
description=tree.find('div',{'id':'description_section','class':'description-section'}) 

Jeder von Ihnen hat einen Vorschlag?

Antwort

1

Sie müssten eine zusätzliche Anfrage machen, um die Beschreibung zu erhalten. Dies ist das komplette Arbeitsbeispiel requests + BeautifulSoup mit:

import requests 
from bs4 import BeautifulSoup 

url = "https://www.rockethub.com/projects/34210-lunar-lion-the-first-ever-university-led-mission-to-the-moon/" 
with requests.Session() as session: 
    session.headers = { 
     "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36" 
    } 

    # get the token 
    response = session.get(url) 
    soup = BeautifulSoup(response.content, "html.parser") 
    token = soup.find("meta", {"name": "csrf-token"})["content"] 

    # get the description 
    description_url = url + "description" 
    response = session.get(description_url, headers={"X-CSRF-Token": token, "X-Requested-With": "XMLHttpRequest"}) 

    soup = BeautifulSoup(response.content, "html.parser") 
    description = soup.find('div', {'id':'description_section', 'class': 'description-section'}) 
    print(description.get_text(strip=True)) 
+0

Vielen Dank! Es funktioniert perfekt. Können Sie mir erklären, warum ich eine zusätzliche Anfrage stellen muss? – Giangio

+1

@Giangio, so ist die Seitenladung implementiert. Sie müssen es auch in Ihrem Code nachahmen. Sie können auch auf eine höhere Ebene gelangen und einen Browser automatisieren, aber das ist eine andere Geschichte. – alecxe

0

Ich benutze XML-Paket zum Web-Scraping, und ich kann nicht die Beschreibung Abschnitt wie Sie mit BeautifulSoup beschrieben.

Wenn Sie jedoch nur diese Seite verwerfen möchten, können Sie die Seite herunterladen. Dann:

page = htmlTreeParse ("Lunar Lion - die erste Universität-Mission zum Mond _ RocketHub.html", useInternal = TRUE, encoding = "UTF-8")

fehlende oder (xpathApply (Seite , '// div [@ id = "description_section"]', xmlValue))

Ich habe versucht, den R-Code herunterzuladen, und ich finde auch den description_section nicht.

url = "https://www.rockethub.com/projects/34210-lunar-lion-the-first-ever-university-led-mission-to-the-moon"

download.file (url, "page.html", mode = "w")

Vielleicht müssen wir einige Optionen in der Funktion download.file hinzufügen. Ich hoffe, dass einige HTML-Experten helfen könnten.

+0

Vielen Dank für Ihre Antwort. Ich muss die gleichen Informationen für ungefähr 2000 URLs herunterladen. So suchte ich nach einer schnelleren Prozedur – Giangio

+0

Tatsächlich können Sie die Webseite automatisch herunterladen (zum Beispiel mit download.file). Aber ich habe ein Problem, bei der Verwendung der R-Funktion download.file unterscheidet sich die heruntergeladene Datei von derjenigen, die manuell heruntergeladen wird. –

0

ich herausgefunden hat, wie mit R Schrott:

library("rvest") 

url="https://www.rockethub.com/projects/34210-lunar-lion-the-first-ever-university-led-mission-to-the-moon/description" 

url %>% 
    html() %>% 
    html_nodes(xpath='//div[@id="description_section"]', xmlValue) %>% 
    html_text()