【问题标题】:How to parse not-well formed XML from web to ElementTree如何将格式不正确的 XML 从 Web 解析到 ElementTree
【发布时间】:2016-07-01 01:35:28
【问题描述】:

我在处理来自网络的 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"?>

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    不要重新发明轮子并使用一个特殊的库来解析 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'}}
    

    【讨论】:

    • 哇!谢谢!我不敢相信那是多么简单。我对 Python 很陌生,今天浪费了很多时间在谷歌上搜索,但从未遇到过 feedparser
    • 我有点困惑,不太了解文档。 d['feed'] 只显示一个条目,而应该有数百个。我该如何访问其余部分?
    【解决方案2】:

    原来使用 lxml 版本的 ElementTree 可以很好地解析我的文件。所以我现在正在使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多