هل هناك طريقة أكثر بيثونيًا للوصول إلى عناصر الأطفال من الآباء باستخدام LXML

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

  •  29-09-2019
  •  | 
  •  

سؤال

أنا أتدفق على مستندات XBRL في محاولة للحصول على رأسي حول كيفية استخراج البيانات واستخدامها بشكل فعال. شيء واحد كنت أعاني منه هو التأكد من استخدام معلومات السياق بشكل صحيح. فيما يلي مقتطف من إحدى المستندات التي ألعبها (هذا من أحدث 10 كيلوترات في Mattel)

أريد أن أكون قادرًا على جمع أزواج القيمة الرئيسية السياق بكفاءة لأنها مهمة للمساعدة في محاذاة "البيانات الحقيقية" هنا مثال على عنصر السياق

- <context id="eol_PE6050----0910-K0010_STD_0_20091231_0">
  - <entity>
     <identifier scheme="http://www.sec.gov/CIK">0000063276</identifier> 
   </entity>
  - <period>
   <instant>2009-12-31</instant> 
   </period>
   </context>

عندما بدأت هذا ، اعتقدت أنه إذا كانت هناك علاقة بين الوالدين والطفل ، فيجب أن أكون قادرًا على الحصول على السمات والمفاتيح والقيم والنص لجميع الأطفال مباشرة من تطبيق طريقة (؟) على الوالد. لكن الأطفال يحتفظون باستقلالهم على الرغم من أنه يمكن العثور عليه من الوالد. ما أعنيه هو أنه إذا كان لدى الأطفال سمات أو مفاتيح أو قيم أو رسالة نصية لا يمكن الوصول إليها مباشرة من الوالد بدلاً من ذلك عليك تحديد/تحديد الأطفال ومن الأطفال الذين يصلون إلى البيانات أو البيانات الوصفية المطلوبة.

لست متأكدًا تمامًا من سبب كون هذه الكتلة من الكود نقطة انطلاق جيدة:

 from lxml import etree
 test_tree=etree.parse(r'c:\temp\test_xml\mat-20091231.xml')
 tree_list=[p for p in test_tree.getiterator() 

لذا فإن Tree_list هي قائمة بالعناصر التي تم تحديدها على وجودها في ملف XML الخاص بي
نظرًا لأنه لم يكن هناك سوى 664 عنصرًا في Tree_list ، فقد قمت بالافتراض السيئ للغاية بأن جميع العناصر الموجودة داخل أحد الوالدين قد تم إدراجها في الوال

for each in tree_list:
    if 'context' in each.tag:
        contextlist.append(each)

هذا هو أنني استمرت في تطبيق طرق مختلفة على العناصر في قائمة السياق وأصيبت بالإحباط حقًا. أخيرًا ، بينما كنت أكتب السؤال الذي كنت أحاول الحصول على بعض المساعدة في معرفة الطريقة التي ستعطيني الكيان والفترة التي قررت أن أحاول فقط

children=[c for c in contextlist[0].iterchildren()]

لذا فإن قائمتي لديها جميع الأطفال من العنصر الأول في قائمة السياق الخاصة بي

أحد الأطفال هو عنصر الكيان ، والآخر هو عنصر الفترة

الآن ، ينبغي أن يكون لكل من هؤلاء الأطفال طفل ، وعنصر الكيان لديه عنصر الطفل معرف ، وعنصر الفترة لديه عنصر طفل فوري ، أصبح هذا أكثر تعقيدًا مما بدا هذا الصباح.

يجب أن أعرف التفاصيل التي يتم الإبلاغ عنها بواسطة عناصر السياق لتقييم البيانات الحقيقية والعمل بشكل صحيح. يبدو أنني يجب أن أختبر كل من أطفال عناصر السياق هل هناك طريقة أسرع أكثر كفاءة للحصول على هذه القيم؟ إعادة صياغة ، هل هناك طريقة للحصول على بعض العناصر وإنشاء بنية بيانات تحتوي على جميع أطفالها وأحفادها وما إلى ذلك دون الحاجة إلى القيام بقدر لا بأس به من عبارات أخرى

بمجرد أن أحصل عليها ، يمكنني البدء في إنشاء قاموس بيانات وتعيين عناصر البيانات لإدخالات معينة بناءً على السياق. لذا فإن الحصول على عناصر السياق بكفاءة وكاملة أمر بالغ الأهمية لمهمتي.

هل كانت مفيدة؟

المحلول

باستخدام واجهة شجرة العنصر (والتي تدعمها أيضًا) ، getiterator يتكرر على جميع العقد في الشجرة الجذرية في العنصر الحالي.

لذا، [list(c.getiterator()) for c in contextlist] يمنحك قائمة القوائم التي تريدها (أو قد ترغب في الاحتفاظ بها c في القائمة الناتجة لتجنب الاضطرار إلى ضغطها باستخدام قائمة سياق في وقت لاحق ، على سبيل المثال ، قم بإعداد قائمة من tuples [(c, list(c.getiterator())) for c in contextlist], ، اعتمادا على الاستخدام المقصود).

لاحظ في اجتياز قائمة النموذج الدقيق [x for x in whatever] لا معنى لها - الاستخدام list(whatever), ، بدلاً من ذلك ، لتحويل أي شيء آخر يتمتع به إلى قائمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top