使用lxml提取未知元素的数据
我有一些大致标准化的sgml文件。不过,在打开文件并亲自阅读之前,我并不知道某些标签里面会包含哪些数据。例如,这些文件里有地址,通常地址包括街道、城市、州、邮政编码和电话。每个地址的部分都是用标签来表示的。
<ADDRESS>
<STREET>One Main Street
<CITY>Gotham City
<ZIP>99999 0123
<PHONE>555-123-5467
</ADDRESS>
但是,比如说,我发现还有国家、街道1、街道2这些标签。我需要处理超过20万个文件,我想知道是否可以提取出所有地址的部分,而不必担心未知标签的存在。
到目前为止,我做了以下工作:
h=fromstring(my_data_in_a_string)
for each in h.cssselect('mail_address'):
each.text_content()
但我遇到的问题是,我无法确定一个元素在哪里结束,另一个元素又从哪里开始。
One Main StreetGotham City99999 0123555-123-5467
1 个回答
2
要获取所有的标签,我们可以这样遍历文档:
假设你的XML结构是这样的:
<ADDRESS>
<STREET>One Main Street</STREET>
<CITY>Gotham City</CITY>
<ZIP>99999 0123</ZIP>
<PHONE>555-123-5467</PHONE>
</ADDRESS>
我们解析它:
>>> from lxml import etree
>>> f = etree.parse('foo.xml') # path to XML file
>>> root = f.getroot() # get the root element
>>> for tags in root.iter(): # iter through the root element
... print tags.tag # print all the tags
...
ADDRESS
STREET
CITY
ZIP
PHONE
现在假设你的XML中还有一些额外的标签;这些标签你可能并不知道。因为我们在遍历XML,所以上面的代码也会返回这些标签。
<ADDRESS>
<STREET>One Main Street</STREET>
<STREET1>One Second Street</STREET1>
<CITY>Gotham City</CITY>
<ZIP>99999 0123</ZIP>
<PHONE>555-123-5467</PHONE>
<COUNTRY>USA</COUNTRY>
</ADDRESS>
上面的代码返回:
ADDRESS
STREET
STREET1
CITY
ZIP
PHONE
COUNTRY
如果我们想获取标签的文本,步骤是一样的。只需要像这样打印tag.text:
>>> for tags in root.iter():
... print tags.text
...
One Main Street
One Second Street
Gotham City
99999 0123
555-123-5467
USA