【问题标题】:lxml etree parse failure (IOError) [closed]lxml etree 解析失败(IOError)[关闭]
【发布时间】:2017-06-06 15:20:36
【问题描述】:

我正在尝试运行这个程序。直到今天它工作正常。我的代码没有任何改变。

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)

这是我的错误信息:

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

网站上有一些关于将StringIO 添加到参数的文档(见下文)。但我觉得奇怪的是我以前从来没有这样做过。

tree = etree.parse(StringIO(myString))

编辑:更完整的堆栈跟踪。

>>> 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"

【问题讨论】:

  • 您说“直到今天它都运行良好。我的代码没有任何改变”但是您正在从您无法控制的 Web 服务器下载文件。服务器端似乎很可能发生了一些变化,现在您需要更新代码以应对变化。
  • @bdesham 感谢您的回复。我对此还比较陌生,所以请多多包涵。这个问题似乎出现在几个不同的网站上,这些网站可能由不同的网络服务器控制(或者我在这里不知道)。由于它在几个 URL 上因相同的原因而失败,我认为这是一个代码问题。无论如何,我不确定如何更新我的代码以处理更改,所以欢迎任何反馈。
  • 添加StringIO 是否改变了结果?如果您尝试在运行 Python 代码的同一台计算机上的网络浏览器中加载该 Yahoo URL,您能看到该网页吗?
  • @bdesham StringIO 不工作。它说“模块对象不可调用”。但我可能用错了。我尝试将它放在函数调用和函数参数本身中,并且都产生了相同的错误。是的,我可以在浏览器中看到该网页。谢谢
  • 会不会是解析器的问题? (我添加了堆栈跟踪。)

标签: python parsing lxml xml.etree


【解决方案1】:

如果您正在寻找解释,现在可以停止阅读。另一方面,如果您寻求补救措施,那么可能就是这样。

>>> 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>]

简而言之,使用requests 将页面作为字符串获取,使用lxml 解析该字符串并照常继续。

编辑:在运行此代码之前,您需要 import requestsimport lxml.etree

【讨论】:

  • 谢谢比尔。我要补充的唯一警告是需要包括:导入请求
  • 如果您要解释实际问题是什么以及您的代码如何解决它,这对 OP 和其他人来说将是一个更有用的答案。
  • @bdesham:我多么希望我能做到!
  • @GC123: 是的,但后来我也没有import lxml.etree,认为这些在 SO 上相当明显。好的,好的,我会提到他们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2017-07-20
  • 2013-02-19
  • 2023-03-31
  • 1970-01-01
  • 2019-05-10
相关资源
最近更新 更多