ElementTree из python не находит дочерний тег - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь получить доступ к элементу из файла XML из Python с помощью ElementTree, и он не находит его.

XML код:

<item>
        <id>12345678</id>
        <subs>
            <sub category="A">
                <name>Name 1 text</name>
                <file>File 1 text</file>
            </sub>
            <sub category="B">
                <name>Name 2 text</name>
                <file>File 2 text</file>
            </sub>
        </subs>
        <number>Number text</number>
        <title>Title text</title>
</item>

Я хочу прочитать текст тега file:

Python код:

import urllib2
import ElementTree as ET

root = ET.ElementTree(file=urllib2.urlopen('http://..../filename.jsp?id=12345678')).getroot()

if __name__ == '__main__':
    for subtags in root.findall('sub'):
        filetext = subtags.find('file').text
        print(filetext)

Вывод должен быть таким:

> File 1 text
> File 2 text

Но вывод, который я получаю, является ничем (пустым), а затем, через 10 секунд, программа перестает работать, без каких-либо ошибок.

Я пробовал это с другими тегами из XML и работает .

Спасибо.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

findall ищет только прямых потомков, если вы дадите ему имя тега.

Вы можете искать во всех потомках с помощью запроса XPath, например:

root.findall('.//sub')
0 голосов
/ 10 мая 2020

Попробуйте, только для справки.

from simplified_scrapy import SimplifiedDoc,utils,req
html = '''<item>
        <id>12345678</id>
        <subs>
            <sub category="A">
                <name>Name 1 text</name>
                <file>File 1 text</file>
            </sub>
            <sub category="B">
                <name>Name 2 text</name>
                <file>File 2 text</file>
            </sub>
        </subs>
        <number>Number text</number>
        <title>Title text</title>
</item>'''
doc = SimplifiedDoc(html)
files = doc.selects('sub').file.text
print(files)

Результат:

['File 1 text', 'File 2 text']
...