2010-11-17 53 views
1

我有一些大致标准化的sgml文件。但是,在我打开文件并亲自读取它之前,可能会在标记中包含我不知道的数据。例如,这些文件具有地址,通常地址具有街道,城市,州,邮编和电话。地址的每个元素都表示一个标签使用lxml提取所有元素不提前知道的数据

<ADDRESS> 
<STREET>One Main Street 
<CITY>Gotham City 
<ZIP>99999
<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-123-5467 
+0

所以,你要得到所有存在于文件中的标签? – user225312 2010-11-17 04:57:30

+0

是的,没有。首先获取文件中的所有标签会很好,但我也希望获得所有标签,如文件 – PyNEwbie 2010-11-17 05:03:01

+0

的ADDRESS部分我很困惑 - 您的输入是SGML,但您接受了涉及解析XML的答案 - 拥有您是否找到了一种将您的SGML首先转换为XML的方法?如果是这样,我可以使用你的技术! :) – 2012-04-15 00:14:29

回答

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
555-123-5467 
USA 
+0

谢谢我欣赏它。这有很大帮助 – PyNEwbie 2010-11-17 05:19:54