すべての要素が事前に知られていない抽出データにlxmlのを使用して

StackOverflow https://stackoverflow.com/questions/4201562

  •  25-09-2019
  •  | 
  •  

質問

私は大まかに標準化されているいくつかのSGMLファイルを持っています。ただし、データは私がファイルを開いて、個人的にそれを読む前に存在しているかわからないというタグ内にあっ収容することができます。たとえば、ファイルがアドレスを持っており、一般的にアドレスが通り、市、州、郵便番号や携帯電話を持っています。アドレスの各要素がタグを用いて示されている

 <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()

しかし、私は取得することは、私は1つの要素の端を識別することはできませんので、問題があると、次の

始まります
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