2015-02-03 50 views
5

http://www.doi2bib.org/ tarafından oluşturulan bibtex atıfını döndürmek için python3 kullanmaya çalışıyorum. URL'ler öngörülebilir olduğundan, komut dosyası web sayfasıyla etkileşime girmeden URL'yi çalıştırabilir. Selenyum, bs4, vb. Kullanmayı denedim ancak kutunun içindeki metni alamıyorum.Javascript oluşturulan içerik için Python web kazıma

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) 

herkes piton bir dize (ya da herneyse) olarak bibtex alıntı dönen bir yol önerebilir?

cevap

8

BeautifulSoup'a ihtiyacınız yok.

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) 

Baskılar: Ayrıca şunu da yapabilirsiniz

@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} 
} 

requests ile, bibtex alıntı doldurun örneğin, onu taklit etmek sunucuya gönderilen bir ek XHR istek yoktur selenium ile çöz.

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() 

yukarıdaki çözüm olarak aynı yazdırır: Burada anahtar hüner alıntı to become visible beklemek bir Explicit Wait kullanmaktır.

+0

Bunun için teşekkürler. Ek isteğin http://www.doi2bib.org/doi2bib adresine nasıl gönderildiğini bana söyler misiniz? Buna oldukça yeni. – Nick

+1

@Not emin, açık tarayıcı geliştirici araçları-> ağ sekmesi. Web sitesine gidin ve sayfa yüklenirken sunucuya gönderilen tüm istekleri görün. Diğerleri arasında bahsettiğim şeyi göreceksiniz. Umarım yardımcı olur. – alecxe

İlgili konular