2017-08-25 2 views
0

ich den folgenden Code geschrieben versuchen, eine Google-Gelehrter Seite darunterBeautifulSoup erreicht nicht ein untergeordnetes Element

import requests as req 
from bs4 import BeautifulSoup as soup 

url = r'https://scholar.google.com/scholar?hl=en&q=Sustainability and the measurement of wealth: further reflections' 

session = req.Session() 
content = session.get(url) 
html2bs = soup(content.content, 'lxml') 
gs_cit = html2bs.select('#gs_cit') 
gs_citd = html2bs.find('div', {'id':"gs_citd"}) 
gs_cit1 = html2bs.find('div', {'id':"gs_cit1"}) 

aber die gs_citd gibt mir nur diese Zeile <div aria-live="assertive" id="gs_citd"></div> und erreicht nicht jede Ebene zu kratzen. Auch gs_cit1 gibt None zurück.

Wie in diesem Bild erscheint

Ich mag die markierte Klasse erreichen in der Lage sein, das BibTeX Zitat zu greifen.

Können Sie bitte helfen!

+0

leider, dass ' "Cite"' Pop-up-Fenster, das Sie schaben wollen, ist ein 'javascript' Ereignis von' 'Cite in der zugrunde liegenden Web-Seite bekommen. Da es sich bei Beautifulsoup um einen Parser und nicht um einen interaktiven Webbrowser handelt, müssen Sie möglicherweise eine Lösung mit "Selen", "PhantomJS" oder einem anderen Tool in Erwägung ziehen. – davedwards

+0

Ich habe versucht, es mit "Selen" zu lösen, aber google erschreckt, wenn ich versuche, mehrere Artikel zu greifen –

+0

@downshift sollten Sie Ihren Kommentar als Antwort hinzufügen – ands

Antwort

2

Ok, also habe ich es herausgefunden. Ich habe das Selenium-Modul für Python benutzt, das auf Wunsch einen virtuellen Browser erstellt, mit dem Sie Aktionen wie das Klicken auf Links und das Abrufen der Ausgabe des resultierenden HTML ausführen können. Es gab ein anderes Problem, das ich beim Lösen dieses Problems erfuhr. Die Seite musste geladen werden, ansonsten wurde nur der Inhalt "Loading ..." im Popup-div zurückgegeben, so dass ich das Python-Zeitmodul für 2 Sekunden auf time.sleep(2) verwendete der zu ladende Inhalt. Dann analysierte ich die resultierende HTML-Ausgabe mit BeautifulSoup, um den Anker-Tag mit der Klasse "gs_citi" zu finden. Dann zog die href vom Anker und legte diese in eine Anfrage mit "Anfragen" -Python-Modul. Schließlich schrieb ich die entschlüsselte Antwort in eine lokale Datei - scholar.bib.

Ich installierte chromedriver und Selen auf meinem Mac diese Anweisungen verwenden hier: https://gist.github.com/guylaor/3eb9e7ff2ac91b7559625262b8a6dd5f

dann von Python-Datei signiert Firewall-Probleme mit diesen Anweisungen zu ermöglichen, zu stoppen: Add Python to OS X Firewall Options?

Im Folgenden ist der Code, den ich verwendet, um die Ausgabedatei „scholar.bib“ zu produzieren:

dies jemand nach einer Lösung, um das hilft
import os 
import time 
from selenium import webdriver 
from bs4 import BeautifulSoup as soup 
import requests as req 

# Setup Selenium Chrome Web Driver 
chromedriver = "/usr/local/bin/chromedriver" 
os.environ["webdriver.chrome.driver"] = chromedriver 
driver = webdriver.Chrome(chromedriver) 

# Navigate in Chrome to specified page. 
driver.get("https://scholar.google.com/scholar?hl=en&q=Sustainability and the measurement of wealth: further reflections") 

# Find "Cite" link by looking for anchors that contain "Cite" - second link selected "[1]" 
link = driver.find_elements_by_xpath('//a[contains(text(), "' + "Cite" + '")]')[1] 
# Click the link 
link.click() 

print("Waiting for page to load...") 
time.sleep(2) # Sleep for 2 seconds 

# Get Page source after waiting for 2 seconds of current page in Chrome 
source = driver.page_source 

# We are done with the driver so quit. 
driver.quit() 

# Use BeautifulSoup to parse the html source and use "html.parser" as the Parser 
soupify = soup(source, 'html.parser') 

# Find anchors with the class "gs_citi" 
gs_citt = soupify.find('a',{"class":"gs_citi"}) 

# Get the href attribute of the first anchor found 
href = gs_citt['href'] 

print("Fetching: ", href) 

# Instantiate a new requests session 
session = req.Session() 

# Get the response object of href 
content = session.get(href) 

# Get the content and then decode() it. 
bibtex_html = content.content.decode() 

# Write the decoded data to a file named scholar.bib 
with open("scholar.bib","w") as file: 
    file.writelines(bibtex_html) 

Hoffnung aus.

Scholar.bib Datei:

@article{arrow2013sustainability, 
    title={Sustainability and the measurement of wealth: further reflections}, 
    author={Arrow, Kenneth J and Dasgupta, Partha and Goulder, Lawrence H and Mumford, Kevin J and Oleson, Kirsten}, 
    journal={Environment and Development Economics}, 
    volume={18}, 
    number={4}, 
    pages={504--516}, 
    year={2013}, 
    publisher={Cambridge University Press} 
} 
+0

Vielen Dank, @Kyle, das ist eine sehr gründliche Lösung ... Ich möchte nur einige Dinge klären .... Erstens, warum nicht bis zum Ende mit Selen lösen. Ich konnte alle Klicks simulieren, bis ich das Zitat mit Selen ergriff. Der Punkt bei Selen ist, dass Google, wenn ich das für mehrere Zeitungen mache, weiß, dass es ein automatisierter Prozess ist und beginnt, nach Verifizierung zu fragen, was den Prozess natürlich stoppt. Glauben Sie, dass Ihre Lösung dieses Problem lösen wird? Der andere Punkt ist, Selen hat eine 'implicitly_wait()' Funktion, die wir anstelle der 'time.sleep()' one verwenden können. –

+0

Hatte nicht bemerkt, dass die 'implicity_wait()' Funktion von Selen verfügbar war und ich dachte nur, wir müssten nur mit dem Bot automatisieren, was notwendig war, um die richtige Quelle zu bekommen, aber ich bin mir sicher, dass Sie einfach alles mit umfangreiche Selenbibliothek. – kyle

+0

Ich könnte es mit selen @ kyle tun, aber meine Bedenken sind das Problem der Authentifizierung. Auch die Verwendung der Selenium-Methode mit einer Liste von Arbeiten wird zum Beispiel ineffizient sein, denke ich. –

Verwandte Themen