2010-11-17 2 views
1

У меня есть некоторые файлы sgml, которые примерно стандартизованы. Однако, прежде чем открыть файл и лично его прочитать, могут быть данные, содержащиеся в теге, который я не знаю. Например, файлы имеют адреса и, как правило, адреса имеют улицу, город, штат, почтовый индекс и телефон. Каждый элемент адреса указывается с меткойИспользование lxml для извлечения данных, где все элементы не известны заранее

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

Но, к примеру, я обнаружил, что есть метки для страны, Street1, STREET2. У меня есть более 200 тыс. Файлов для обработки, и я хочу знать, можно ли вытащить все элементы адресов, не беспокоясь о существовании неизвестных тегов.

То, что я сделал до сих пор является

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

+0

Ну да и нет. Первое получение всех тегов в файле было бы замечательно, но я также хотел бы получить все теги, как в разделе ADDRESS файла – PyNEwbie

+0

Я запутался - ваш ввод SGML, но вы приняли ответ, который включает в себя анализ XML - есть вы нашли способ конвертировать SGML в XML в первую очередь? Если это так, я могу использовать вашу технику! :) –

ответ

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