Python-Web-Scraping für Javascript generierte Inhalte

Ich versuche, python3 zu benutzen, um das von http://www.doi2bib.org/ erzeugte bibtex-Zitat zurückzugeben. Die URL ist vorhersehbar, so dass das Skript die URL ausarbeiten kann, ohne mit der Webseite interagieren zu müssen. Ich habe versucht, mit Selen, bs4, etc aber kann nicht den Text in der Box.

url = "http://www.doi2bib.org/#/doi/10.1007/s00425-007-0544-9" import urllib.request from bs4 import BeautifulSoup text = BeautifulSoup(urllib.request.urlopen(url).read()) print(text) 

Kann jemand vorschlagen, einen Weg der Rückkehr der bibtex Zitat als String (oder was auch immer) in Python?

  • Kombinieren von Werten für eine große Anzahl von überlappenden Intervallen von Wörterbuchschlüsseln
  • Sind die Integer-Schlüssel in einem Python-Wörterbuch sortiert und mit Priorität sortiert?
  • Wie man ein Dict mit Schlüsseln aus einer Liste und einem leeren Wert in Python initialisiert?
  • Javascript-Variablen in Django HTML-Vorlagen
  • Entfernen von mehreren Schlüsseln aus einem Wörterbuch sicher
  • Wörterbuch in python mit Auftrag habe ich am Anfang eingestellt
  • One Solution collect form web for “Python-Web-Scraping für Javascript generierte Inhalte”

    Du brauchst hier keine BeautifulSoup See. Es wird eine zusätzliche XHR-Anfrage an den Server gesendet, um das bibtex-Zitat auszufüllen, es zB mit requests simulieren:

     import requests bibtex_id = '10.1007/s00425-007-0544-9' url = "http://www.doi2bib.org/#/doi/{id}".format(id=bibtex_id) xhr_url = 'http://www.doi2bib.org/doi2bib' with requests.Session() as session: session.get(url) response = session.get(xhr_url, params={'id': bibtex_id}) print(response.content) 

    Drucke:

     @article{Burgert_2007, doi = {10.1007/s00425-007-0544-9}, url = {http://dx.doi.org/10.1007/s00425-007-0544-9}, year = 2007, month = {jun}, publisher = {Springer Science $\mathplus$ Business Media}, volume = {226}, number = {4}, pages = {981--987}, author = {Ingo Burgert and Michaela Eder and Notburga Gierlinger and Peter Fratzl}, title = {Tensile and compressive stresses in tracheids are induced by swelling based on geometrical constraints of the wood cell}, journal = {Planta} } 

    Sie können es auch mit selenium lösen. Der wichtigste Trick hier ist, eine explizite Warte zu verwenden, um zu warten, bis das Zitat sichtbar wird :

     from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get('http://www.doi2bib.org/#/doi/10.1007/s00425-007-0544-9') element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//pre[@ng-show="bib"]'))) print(element.text) driver.close() 

    Druckt dasselbe wie die obige Lösung.

    Python ist die beste Programmiersprache der Welt.