باستخدام 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. لديّ أكثر من 200 ألف ملف لمعالجة وأريد أن أعرف ما إذا كان من الممكن سحب جميع عناصر العناوين دون الحاجة إلى القلق بشأن معرفة وجود علامات غير معروفة.

ما فعلته حتى الآن هو

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

لكن ما أحصل عليه هو مشكلة لأنني لا أستطيع تحديد مكان انتهاء عنصر واحد ويبدأ التالي

One Main StreetGotham City99999 0123555-123-5467
هل كانت مفيدة؟

المحلول

للحصول على جميع العلامات ، نرتب من خلال المستند مثل هذا:

افترض أن بنية 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