如何使用lxml提取字段中的文本(如果字段存在)?
我刚接触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