【问题标题】:ElementTree from python doesn't find a child tag来自python的ElementTree找不到子标签
【发布时间】:2020-04-30 09:08:36
【问题描述】:

我正在尝试使用ElementTree 访问来自PythonXML 文件中的元素,但它没有找到它。

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 的其他标签,并且它有效

谢谢。

【问题讨论】:

    标签: python python-3.x xml urllib2 elementtree


    【解决方案1】:

    findall 仅查找直接子代,如果您为其指定标签名称。

    您可以使用 XPath 查询搜索所有后代,例如:

    root.findall('.//sub')
    

    【讨论】:

    • 我试过了,但我得到了那个错误: Traceback (last recent call last): File "Myfile.py", line 51, in filetext = subtags.find('file' ).text AttributeError: 'NoneType' object has no attribute 'text' 我认为问题在于方法findall 返回一个None 对象而不是Element 对象
    • 这是一个不同的问题,您应该可以很好地解析您发布的 XML 文件。
    【解决方案2】:

    试试这个,仅供参考。

    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']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      相关资源
      最近更新 更多