2017-06-06 2 views
0

J'essaie d'exécuter ce programme. Ça fonctionnait bien jusqu'à aujourd'hui. Rien n'a été changé de mon côté dans le code.lxml etree parse failure (IOError)

import lxml.etree 
import urlparse 
import re 

def parse_url(url): 
    return lxml.etree.parse(url, lxml.etree.HTMLParser()) 

urlivv = "http://finance.yahoo.com/q?s=IVV" 
docivv = parse_url(urlivv) 

Ceci est mon message d'erreur:

IOError: Error reading file 'http://finance.yahoo.com/q?s=IVV': failed to load external entity "http://finance.yahoo.com/q?s=IVV"

Il y avait un peu de documentation sur le site sur l'ajout StringIO à l'argument (voir ci-dessous). Mais je trouve étrange que je n'ai jamais eu à le faire auparavant.

tree = etree.parse(StringIO(myString)) 

Modifier: Trace de pile plus complète.

>>> import lxml.etree 
>>> tree = lxml.etree.parse('http://finance.yahoo.com/q?s=IVV', parser=lxml.etree.HTMLParser()) 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
    File "src\lxml\lxml.etree.pyx", line 3427, in lxml.etree.parse (src\lxml\lxml.etree.c:81100) 
    File "src\lxml\parser.pxi", line 1811, in lxml.etree._parseDocument (src\lxml\lxml.etree.c:117831) 
    File "src\lxml\parser.pxi", line 1837, in lxml.etree._parseDocumentFromURL (src\lxml\lxml.etree.c:118178) 
    File "src\lxml\parser.pxi", line 1741, in lxml.etree._parseDocFromFile (src\lxml\lxml.etree.c:117090) 
    File "src\lxml\parser.pxi", line 1138, in lxml.etree._BaseParser._parseDocFromFile (src\lxml\lxml.etree.c:111636) 
    File "src\lxml\parser.pxi", line 595, in lxml.etree._ParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:105092) 
    File "src\lxml\parser.pxi", line 706, in lxml.etree._handleParseResult (src\lxml\lxml.etree.c:106800) 
    File "src\lxml\parser.pxi", line 633, in lxml.etree._raiseParseError (src\lxml\lxml.etree.c:105611) 
OSError: Error reading file 'http://finance.yahoo.com/q?s=IVV': failed to load external entity "http://finance.yahoo.com/q?s=IVV" 
+2

Vous dites "Ça fonctionnait bien jusqu'à aujourd'hui. Rien n'a été changé de mon côté dans le code "mais vous téléchargez un fichier à partir d'un serveur web que vous ne contrôlez pas. Il semble très probable que quelque chose a changé du côté du serveur et que maintenant vous devez mettre à jour votre code pour faire face au changement. – bdesham

+0

@bdesham Merci pour la réponse. Je suis encore plus jeune, alors s'il vous plaît, supportez-moi. Le problème semble apparaître sur plusieurs sites différents qui sont probablement contrôlés par différents serveurs Web (ou je suis ignorant ici). Comme il a échoué pour la même raison sur plusieurs URL, j'ai supposé que c'était un problème de code. Peu importe, je ne suis pas sûr de la façon dont je mettrais à jour mon code pour faire face au changement, alors n'hésitez pas à nous faire part de vos commentaires. – GC123

+0

L'ajout de 'StringIO' a-t-il changé le résultat? Si vous essayez de charger cette URL Yahoo dans un navigateur Web sur le même ordinateur qui exécute le code Python, êtes-vous en mesure de voir la page Web? – bdesham

Répondre

1

Si vous cherchez une explication, vous pouvez arrêter de lire maintenant. D'un autre côté, si vous cherchez un remède, alors cela pourrait être le cas.

>>> page = requests.get('http://finance.yahoo.com/q?s=IVV').text 
>>> lxml.etree.fromstring(page) #fails 
>>> tree = lxml.etree.fromstring(page, parser=lxml.etree.HTMLParser()) 
>>> tree.xpath('.//table[@class="W(100%)"]') 
[<Element table at 0x607dc08>] 

En bref, utilisez requests pour aller chercher la page en tant que chaîne, analyser cette chaîne avec lxml et continuer comme d'habitude.

Modifier: Avant que ce code ne soit exécuté, vous aurez besoin de import requests et import lxml.etree.

+0

Merci Bill. La seule mise en garde que je voudrais ajouter est qu'il faut inclure: demandes d'importation – GC123

+0

Ce serait une réponse beaucoup plus utile-à l'OP et d'autres-si vous deviez expliquer quel était le problème réel et comment votre code le résout. – bdesham

+0

@bdesham: Comme j'aimerais pouvoir! –