我有大致标准化一些SGML文件。但是,可以包含在标签内的数据,我做我打开该文件,并亲自阅读它之前并不知道存在。例如,文件有地址,一般的地址有一个街道,一个城市,一个国家,一个zip和电话。地址的每个元素指示与标签

 <ADDRESS>
 <STREET>One Main Street
 <CITY>Gotham City
 <ZIP>99999 0123
 <PHONE>555-123-5467
 </ADDRESS>

但是,例如,我发现有对国家,STREET1,STREET2标签。我有超过200K的文件,进程,我想知道是否有可能撤出所有地址的内容,而不必担心知道未知标签的存在。

我迄今所做的是

h=fromstring(my_data_in_a_string)
for each in h.cssselect('mail_address'):
    each.text_content()

但我得到的是有问题的,因为我不能确定其中一个元素结束和下一个开始

One Main StreetGotham City99999 0123555-123-5467
有帮助吗?

解决方案

要得到所有的标签,我们通过ITER像这样的文件:

假设你的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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top