2015-03-16 3 views
1

Я использую pinnacle (betting) api, который возвращает XML-файл. На данный момент я сохранить его в XML-файл, как показано ниже:XML в Python и lxml

req = urllib2.Request(url, headers=headers) 
responseData = urllib2.urlopen(req).read() 

ofn = 'pinnacle_feed_basketball.xml' 
with open(ofn, 'w') as ofile: 
    ofile.write(responseData) 
parse_xml() 

, а затем открыть его в функции parse_xml

tree = etree.parse("pinnacle_feed_basketball.xml") 
fdtime = tree.xpath('//rsp/fd/fdTime/text()') 

Я предполагая сохранить его в виде файла XML, а затем чтение в файл не нужен, но я не могу заставить его работать, не делая этого.

Я попытался переходящая в responseData функции parsexml()

parse_xml(responseData) 

, а затем в функции

tree = etree.parse(responseData) 
fdtime = tree.xpath('//rsp/fd/fdTime/text()') 

Но это не работает.

+1

Если вы хотите, чтобы разобрать объект в памяти (в вашем случае, строка), используйте 'etree.fromstring ()' - 'etree.parse' ожидает файл-подобный объект - [Документы] (http://lxml.de/parsing.html#parsers) – jedwards

ответ

1

Если вы хотите, чтобы разобрать объект в памяти (в вашем случае, строка), используйте etree.fromstring(<obj>) - etree.parse ожидает файл-подобный объект или имя файла - Docs

Например:

import urllib2, lxml.etree as etree 

url = 'http://www.xmlfiles.com/examples/note.xml' 
headers = {} 

req = urllib2.Request(url, headers=headers) 
responseData = urllib2.urlopen(req).read() 

element = etree.fromstring(responseData) 
print(element) 
print(etree.tostring(element, pretty_print=True)) 

Выход:

<Element note at 0x2c29dc8> 
<note> 
    <to>Tove</to> 
    <from>Jani</from> 
    <heading>Reminder</heading> 
    <body>Don't forget me this weekend!</body> 
</note> 
1

parse() предназначен для чтения от file-like objects.

Но вы передаете строку в обоих случаях - pinnacle_feed_basketball.xml string и responseData, которая также является строкой.

В первом случае он должен быть:

with open("pinnacle_feed_basketball.xml") as f: 
    tree = etree.parse(f) 

Во втором случае:

root = etree.fromstring(responseData) # note that you are not getting an "ElementTree" object here 

FYI, urllib2.urlopen(req) является также файл-подобный объект:

tree = etree.parse(urllib2.urlopen(req))