Как разобрать сжать веб XML с ElementTree - PullRequest
0 голосов
/ 30 марта 2011

Я пытаюсь использовать сокращенный веб-сервис для эскизов сайтов.У них есть API, который возвращает XML, сообщающий вам, можно ли создать эскиз сайта.Я пытаюсь использовать ElementTree для анализа XML, но не знаю, как получить необходимую информацию.Вот пример ответа XML:

<?xml version="1.0" encoding="UTF-8"?> 
<stw:ThumbnailResponse xmlns:stw="http://www.shrinktheweb.com/doc/stwresponse.xsd">
    <stw:Response>
        <stw:ThumbnailResult>
            <stw:Thumbnail Exists="false"></stw:Thumbnail>
            <stw:Thumbnail Verified="false">fix_and_retry</stw:Thumbnail>
        </stw:ThumbnailResult>
        <stw:ResponseStatus>
            <stw:StatusCode>Blank Detected</stw:StatusCode>
        </stw:ResponseStatus>
        <stw:ResponseTimestamp>
            <stw:StatusCode></stw:StatusCode>
        </stw:ResponseTimestamp>
        <stw:ResponseCode>
            <stw:StatusCode></stw:StatusCode>
        </stw:ResponseCode>
        <stw:CategoryCode>
            <stw:StatusCode>none</stw:StatusCode>
        </stw:CategoryCode>
        <stw:Quota_Remaining>
            <stw:StatusCode>1</stw:StatusCode>
        </stw:Quota_Remaining>
    </stw:Response>
</stw:ThumbnailResponse>

Мне нужно получить "stw: StatusCode".Если я пытаюсь найти «stw: StatusCode», я получаю синтаксическую ошибку «ожидаемый разделитель пути».Есть ли способ просто получить код состояния?

1 Ответ

1 голос
/ 30 марта 2011

Пространства имен Grrr .... попробуйте это:

STW_PREFIX = "{http://www.shrinktheweb.com/doc/stwresponse.xsd}"

(см. Строку 2 вашего образца XML)

Тогда, когда вы хотите тег типа stw:StatusCode, используйте STW_PREFIX + "StatusCode"

Обновление: этот XML-ответ не самый блестящий дизайн. Из вашего единственного примера невозможно угадать, может ли быть более 1 узла 2-го уровня. Обратите внимание, что у каждого узла 3-го уровня есть дочерний элемент «StatusCode». Вот примерный и готовый код, который показывает вам (1), почему вам нужен этот STW_PREFIX caper (2) фрагмент полезной информации.

import xml.etree.cElementTree as et
def showtag(elem):
    return repr(elem.tag.rsplit("}")[1])
def showtext(elem):
    return None if elem.text is None else repr(elem.text.strip())
root = et.fromstring(xml_response) # xml_response is your input string
print repr(root.tag) # see exactly what tag is in the element
for child in root[0]:
    print showtag(child), showtext(child)
    for gc in child:
        print "...", showtag(gc), showtext(gc), gc.attrib

Результат:

'{http://www.shrinktheweb.com/doc/stwresponse.xsd}ThumbnailResponse'
'ThumbnailResult' ''
... 'Thumbnail' None {'Exists': 'false'}
... 'Thumbnail' 'fix_and_retry' {'Verified': 'false'}
'ResponseStatus' ''
... 'StatusCode' 'Blank Detected' {}
'ResponseTimestamp' ''
... 'StatusCode' None {}
'ResponseCode' ''
... 'StatusCode' None {}
'CategoryCode' ''
... 'StatusCode' 'none' {}
'Quota_Remaining' ''
... 'StatusCode' '1' {}
...