python - lxml如何通过标记名称获取元素的子元素?

时间:2017-03-19 20:05:11

标签: python lxml

我有一个xml文件,如下所示:

<page>
    <title>title1</title>
    <subtitle>subtitle</subtitle>
    <ns>0</ns>
    <id>1</id>
    <text>hello world!@</text>
</page>
<page>
    <title>title2</title>
    <ns>0</ns>
    <id>1</id>
    <text>hello world</text>
</page> 

如何获取每个页面的文字?现在我有一个每页的列表。以下代码将打印第二个页面元素的文本,但不打印第一个元素的文本。有没有办法按标记名称element['text']

来获取子元素
for i in pages:
    print i[3]

4 个答案:

答案 0 :(得分:6)

您可以编写如下代码:

from lxml import html

xml = """<page>
    <title>title1</title>
    <subtitle>subtitle</subtitle>
    <ns>0</ns>
    <id>1</id>
    <text>hello world!@</text>
</page>
<page>
    <title>title2</title>
    <ns>0</ns>
    <id>1</id>
    <text>hello world</text>
</page>"""

root = html.fromstring(xml)
print(root.xpath('//page/text/text()'))

结果将是:

['hello world!@', 'hello world']

答案 1 :(得分:1)

This tutorial帮助我完成了类似的任务:

每次迭代都会找到一个名为&#39; id&#39;或者&#39; text&#39;。如果未找到任何标记,请返回字符串,&#39;无&#39;。然后,一次迭代的结果将附加到列表中,允许我们以类似于数据框的格式打印该列表。

import lxml
import lxml.etree as ET

# Initialise a list to append results to
list_of_results = []

# Loop through the pages to search for text
for page in root:
    id = page.findtext('id', default = 'None')
    text = page.findtext('text', default = 'None')
    list_of_results.append([id, text])

# Print list
list_of_results

结果:

[['1', 'hello world!@'], ['1', 'hello world']]

如果你想要的只是打印文本,你只需删除id行。

答案 2 :(得分:0)

为简化问题,我使用了一个“节点”帮助程序类,该类将返回一个字典:

class Node():
    @staticmethod
    def childTexts(node):
        texts={}
        for child in list(node):
            texts[child.tag]=child.text
        return texts  

用法示例:

xml = """<pages>
<page>
    <title>title1</title>
    <subtitle>subtitle</subtitle>
    <ns>0</ns>
    <id>1</id>
    <text>hello world!@</text>
</page>
<page>
    <title>title2</title>
    <ns>0</ns>
    <id>1</id>
    <text>hello world</text>
</page>
</pages>

"""

root = etree.fromstring(xml)
for node in root.xpath('//page'):
    texts=Node.childTexts(node)
    print (texts)

结果:

{'title': 'title1', 'subtitle': 'subtitle', 'ns': '0', 'id': '1', 'text': 'hello world!@'}
{'title': 'title2', 'ns': '0', 'id': '1', 'text': 'hello world'}

答案 3 :(得分:0)

我知道这篇文章有点老了,但这是解决我这个问题的代码。
遍历页面并使用每个页面的几个子元素来做事。
在事后看来,使用相对xpath似乎很明显,但是我认为JQuery等使我期望可以使用更多类似“对象”的对象。

var rng = ss.getRange("C2:"+"c"+lr).getDisplayValues()