2017-10-06 10 views
1

J'essaie d'obtenir des données d'evernote 'cahier partagé'. Par exemple, à partir de celui-ci: https://www.evernote.com/pub/missrspink/evernoteexamples#st=p&n=56b67555-158e-4d10-96e2-3b2c57ee372cpython parse evernote cahier partagé

J'ai essayé d'utiliser Beautiful Soup:

url = 'https://www.evernote.com/pub/missrspink/evernoteexamples#st=p&n=56b67555-158e-4d10-96e2-3b2c57ee372c' 
r = requests.get(url) 
bs = BeautifulSoup(r.text, 'html.parser') 
bs 

Le résultat ne contient pas d'informations de texte de l'ordinateur portable, seul un code.

J'ai également vu un conseil pour utiliser le sélénium et trouver des éléments par XPath. Par exemple, je veux trouver la tête de cette note - 'Term 3 Week2'. Dans Google Chrome, j'ai trouvé que c'est XPath est '/ html/body/div [1]/div [1]/b/span/u/b'. donc j'ai essayé ceci:

driver = webdriver.PhantomJS() 
driver.get(url) 
t = driver.find_element_by_xpath('/html/body/div[1]/div[1]/b/span/u/b') 

Mais elle a aussi n'a pas fonctionné, le résultat était 'NoSuchElementException ...'. Je suis un novice en python et en particulier l'analyse, donc je serais heureux de recevoir de l'aide. J'utilise python 3.6.2 et jupiter-notebook.

Merci d'avance.

+0

Pour ajouter à ce que @blakev dit, vous ne serez pas obtenir le code HTML correct, vous voulez des demandes parce que le "#" dans l'URL signifie que le bit après n'est pas envoyé au serveur, donc vous envoyez juste la réponse à 'https: // www.evernote.com/pub/missrspink/evernoteexamples' – AceLewis

Répondre

0

La manière la plus simple de s'interfacer avec Evernote est d'utiliser leur official Python API. Une fois que vous avez configuré votre clé API et que vous pouvez généralement vous connecter, vous pouvez ensuite télécharger et référencer des notes et des blocs-notes.

Les notes Evernote utilisent leur propre langage de modèle appelé ENML (EverNote Markup Language) qui est un sous-ensemble de HTML. Vous pourrez utiliser BeautifulSoup4 pour analyser l'ENML et extraire les éléments que vous recherchez.

Si vous essayez d'extraire des informations par rapport à une installation locale (au lieu de leur application Web), vous pouvez également obtenir ce dont vous avez besoin à partir de l'exécutable. Voir how to pass arguments à l'installation locale pour extraire des données. Pour cela, vous devrez utiliser le module Python3 subprocess.

CEPENDANT

Si vous voulez utiliser le sélénium, cela vous commencer:

import selenium.webdriver.support.ui as ui 
from selenium.webdriver import Chrome 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 

# your example URL 
URL = 'https://www.evernote.com/pub/missrspink/evernoteexamples#st=p&n=56b67555-158e-4d10-96e2-3b2c57ee372c' 

# create the browser interface, and a generic "wait" that we can use 
# to intelligently block while the driver looks for elements we expect. 
# 10: maximum wait in seconds 
# 0.5: polling interval in seconds 
driver = Chrome() 
wait = ui.WebDriverWait(driver, 10, 0.5) 

driver.get(URL) 

# Note contents are loaded in an iFrame element 
find_iframe = By.CSS_SELECTOR, 'iframe.gwt-Frame' 
find_html = By.TAG_NAME, 'html' 

# .. so we have to wait for the iframe to exist, switch our driver context 
# and then wait for that internal page to load. 
wait.until(EC.frame_to_be_available_and_switch_to_it(find_iframe)) 
wait.until(EC.visibility_of_element_located(find_html)) 

# since ENML is "just" HTML we can select the top tag and get all the 
# contents inside it. 
doc = driver.find_element_by_tag_name('html') 

print(doc.get_attribute('innerHTML')) # <-- this is what you want 

# cleanup our browser instance 
driver.quit() 
+0

pour Selenium dont vous avez besoin pour vous assurer que vous installez le pilote web que vous allez utiliser correctement, ou il échouera sur le 'driver = Chrome()' ste p. – jamescampbell

+0

@blakev Merci beaucoup, pour une réponse si complète! La méthode '' sélénium '' fonctionne parfaitement, la méthode '' evernote '' a un inconvénient - il n'y a pas de paquetage officiel pour python 3. donc c'est peut-être un peu plus complexe à utiliser Merci pour votre aide! –