如何从 web 解析格式不正确的 XML 到 ElementTree
How to parse not-well formed XML from web to ElementTree
我在处理来自网络的 XML 文件时遇到困难。这不是我的 XML,所以我无法修改格式。
import urllib
import xml.etree.ElementTree as ET
xmls = urllib.request.urlopen('http://odds.smarkets.com/oddsfeed.xml')
tree = ET.ElementTree(ET.fromstring(xmls.read())
但它给了我一个 ParseError: not well-formed (invalid token): line 1, column 0
我认为这可能与它的编码方式有关,但我对编码一无所知,当我 运行 通过 Chared 它说 utf_8.
我也试过用BeautifulSoup,但是好像只读了第一行
<?xml version=1.0" encoding="utf-8"?>
不要重新发明轮子 并使用特殊的库来解析 XML 提要 - feedparser
:
from pprint import pprint
import feedparser
d = feedparser.parse('http://odds.smarkets.com/oddsfeed.xml')
pprint(d['feed'])
打印:
{'contract': {'id': '16696354',
'name': 'Arthur Burrell',
'slug': 'arthur-burrell'},
'event': {'date': '2016-07-01',
'id': '741548',
'name': '14:10',
'parent': 'Newton Abbot',
'parent_slug': 'newton-abbot',
'slug': 'newton-abbot-2016-07-01T00:00:00-14-10',
'time': '13:10:00',
'type': 'horse racing race',
'url': '/sport/horse-racing/newton-abbot/2016/07/01/14:10'},
'market': {'id': '5464210', 'slug': 'to-place', 'winners': '3'},
'odds': {'timestamp': '2016-07-01T 1:40:15'},
'price': {'backers_stake': '2.50',
'decimal': '1.35',
'liability': '7.14',
'percent': '74.07'}}
事实证明,使用 lxml
版本的 ElementTree 可以很好地解析我的文件。所以我现在正在使用它。
我在处理来自网络的 XML 文件时遇到困难。这不是我的 XML,所以我无法修改格式。
import urllib
import xml.etree.ElementTree as ET
xmls = urllib.request.urlopen('http://odds.smarkets.com/oddsfeed.xml')
tree = ET.ElementTree(ET.fromstring(xmls.read())
但它给了我一个 ParseError: not well-formed (invalid token): line 1, column 0
我认为这可能与它的编码方式有关,但我对编码一无所知,当我 运行 通过 Chared 它说 utf_8.
我也试过用BeautifulSoup,但是好像只读了第一行
<?xml version=1.0" encoding="utf-8"?>
不要重新发明轮子 并使用特殊的库来解析 XML 提要 - feedparser
:
from pprint import pprint
import feedparser
d = feedparser.parse('http://odds.smarkets.com/oddsfeed.xml')
pprint(d['feed'])
打印:
{'contract': {'id': '16696354',
'name': 'Arthur Burrell',
'slug': 'arthur-burrell'},
'event': {'date': '2016-07-01',
'id': '741548',
'name': '14:10',
'parent': 'Newton Abbot',
'parent_slug': 'newton-abbot',
'slug': 'newton-abbot-2016-07-01T00:00:00-14-10',
'time': '13:10:00',
'type': 'horse racing race',
'url': '/sport/horse-racing/newton-abbot/2016/07/01/14:10'},
'market': {'id': '5464210', 'slug': 'to-place', 'winners': '3'},
'odds': {'timestamp': '2016-07-01T 1:40:15'},
'price': {'backers_stake': '2.50',
'decimal': '1.35',
'liability': '7.14',
'percent': '74.07'}}
事实证明,使用 lxml
版本的 ElementTree 可以很好地解析我的文件。所以我现在正在使用它。