在pythonanywhere上运行Python脚本时出现XML解析错误(本地机器正常)

2 投票
1 回答
609 浏览
提问于 2025-04-18 12:09

我正在用Python运行一个Flask应用,其中一部分使用从第三方API获取的XML数据。我在Python脚本中使用minidom来解析这些XML。

相关的Python代码:

from xml.dom import minidom
import requests

usa_xml = requests.get(URL_HERE)
usa_parsed = minidom.parseString(usa_xml.content)

这个脚本会找到并显示XML中的值。在我本地机器上运行这个Python脚本时,一切都正常。但当我把代码放到pythonanywhere上时,解析却失败了,尽管使用的是相同的XML数据。

错误追踪信息:

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.4/dist-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/jshorty/OwlWire/owlwire.py", line 65, in select
    usa_parsed = minidom.parseString(usa_xml.content)
  File "/usr/lib/python3.4/xml/dom/minidom.py", line 1970, in parseString
    return expatbuilder.parseString(string)
  File "/usr/lib/python3.4/xml/dom/expatbuilder.py", line 925, in parseString
    return builder.parseString(string)
  File "/usr/lib/python3.4/xml/dom/expatbuilder.py", line 223, in parseString
    parser.Parse(string, True)
xml.parsers.expat.ExpatError: no element found: line 29, column 7    

因为使用的XML数据是一样的,所以看起来问题不在于XML本身。我不知道该从哪里开始找问题——我在pythonanywhere上使用的是所有默认预装的模块,这会不会是minidom版本不同的问题呢?

错误总是在第29行,第7列,所以这里有一个我正在访问的XML实例的链接: http://ebird.org/ws1.1/data/obs/region_spp/recent?rtype=country&r=US&sci=surnia%20ulula&back=30&maxResults=1&includeProvisional=true

1 个回答

4

我猜你是在用免费的账户。PythonAnywhere的免费账户在网络访问上有一些限制,你只能访问那些在白名单上的网站:

https://www.pythonanywhere.com/wiki/403ForbiddenError

https://www.pythonanywhere.com/whitelist/

如果你调整你的代码去做一个:

usa_xml = requests.get(URL_HERE)
print(usa_xml)

你可能会看到一个

<Response [403]> 

403被禁止的错误。

我们(PythonAnywhere团队)通常很乐意把有公共API的网站加入白名单。ebird.com看起来没问题,我会看看能不能把它加进去。对于其他有类似请求的人,如果你看到403错误,别犹豫,赶紧联系我们!

撰写回答