如何使用lxml提取字段中的文本(如果字段存在)?

0 投票
1 回答
760 浏览
提问于 2025-04-18 09:40

我刚接触lxml,手头有一个包含40,000行数据的xml文件。我看过lxml的教程,但不太确定哪个内置函数最适合我的需求,我想从某个元素中提取文本,具体取决于这个元素是否存在。

    <main>
      <header>
        <row type="info">
          <field name="description"><![CDATA[Results]]></field>
          <field name="created"><![CDATA[6/12/2014 6:45:00 PM]]></field>
        </row>
        <row>
          <field name="profile"><![CDATA[Intel]]></field>
        </row>
      </header>
      <sections>
        <section name="Results">
          <description />
          <parameters />
          <header />
          <content>
            <row>
              # A row-dependend number of fields exist before the Full Content field
              <field name="Full Content"><![CDATA[ I am the text of interest]]></field>
              # A row-dependend number of fields follow here
            </row>
            # There are 40,000 of these row elements
          </content>
          <footer>
            <row type="content_count">
              <field name="count"><![CDATA[9981]]></field>
            </row>
          </footer>
        </section>
      </sections>
    </main>

我想从这40,000行中的每一行提取字段的文本,并把这些数据存储到一个字典里。

我不太清楚怎么用字段名称来遍历xml树,因为子元素的索引在每一行中都不一样。

目前,我有一些这样的xml文件,存储在我创建的一个列表里:

files = get_files("P:\\Data\\files")
xmls = []
for file in files:
    parser = etree.XMLParser(ns_clean=True, recover = True)
    tree = etree.parse(file, parser=parser)
    root = tree.getroot()
    xmls.append(root)

谢谢你的任何建议。

马蒂亚斯

1 个回答

0

这是一个简单的例子,教你如何使用 lxml.cssselect()

import lxml
import lxml.html

data = '''    <main>
      <header>
        <row type="info">
          <field name="description"><![CDATA[Results]]></field>
          <field name="created"><![CDATA[6/12/2014 6:45:00 PM]]></field>
        </row>
        <row>
          <field name="profile"><![CDATA[Intel]]></field>
        </row>
      </header>
      <sections>
        <section name="Results">
          <description />
          <parameters />
          <header />
          <content>
            <row>
              # A row-dependend number of fields exist before the Full Content field
              <field name="Full Content"><![CDATA[ I am the text of interest]]></field>
              # A row-dependend number of fields follow here
            </row>
            # There are 40,000 of these row elements
          </content>
          <footer>
            <row type="content_count">
              <field name="count"><![CDATA[9981]]></field>
            </row>
          </footer>
        </section>
      </sections>
    </main>'''

html = lxml.html.fromstring(data)

fields = html.cssselect('field')

for x in fields:
     print lxml.etree.tostring(x)

.

<field name="description"/>

<field name="created"/>

<field name="profile"/>

<field name="Full Content"/>
              # A row-dependend number of fields follow here

<field name="count"/>

编辑:

这是一个获取 DATA[] 中文本的版本。

import lxml
import lxml.etree

data = '''  ... html_as_previouse  ... '''

et = lxml.etree.fromstring(data)

fields = et.xpath('//field')

for x in fields:
    print x.text

.

Results
6/12/2014 6:45:00 PM
Intel
 I am the text of interest
9981

编辑:

通过名称查找字段。

named_fields = et.xpath('//field[@name="count"]')

for x in named_fields:
    print x.text

撰写回答