Python + Expat: خطأ في ؛ جهات
-
27-09-2019 - |
سؤال
لقد كتبت وظيفة صغيرة ، تستخدم ElementTree و XPath لاستخراج محتويات النص لعناصر معينة في ملف XML:
#!/usr/bin/env python2.5
import doctest
from xml.etree import ElementTree
from StringIO import StringIO
def parse_xml_etree(sin, xpath):
"""
Takes as input a stream containing XML and an XPath expression.
Applies the XPath expression to the XML and returns a generator
yielding the text contents of each element returned.
>>> parse_xml_etree(
... StringIO('<test><elem1>one</elem1><elem2>two</elem2></test>'),
... '//elem1').next()
'one'
>>> parse_xml_etree(
... StringIO('<test><elem1>one</elem1><elem2>two</elem2></test>'),
... '//elem2').next()
'two'
>>> parse_xml_etree(
... StringIO('<test><null>�</null><elem3>three</elem3></test>'),
... '//elem2').next()
'three'
"""
tree = ElementTree.parse(sin)
for element in tree.findall(xpath):
yield element.text
if __name__ == '__main__':
doctest.testmod(verbose=True)
فشل الاختبار الثالث مع الاستثناء التالي:
Expaterror: إشارة إلى رقم الحرف غير صالح: السطر 1 ، العمود 13
هل �
الكيان غير القانوني XML؟ بغض النظر عما إذا كان الأمر كذلك أم لا ، فإن الملفات التي أريد تحليلها تحتوي عليها ، وأحتاج إلى بعض الشيء لتحليلها. أي اقتراحات لمحلل آخر من المغتربين ، أو إعدادات المغتربين ، من شأنها أن تسمح لي بالقيام بذلك؟
تحديث: اكتشفت جميل الآن فقط ، محلل حساء العلامة كما هو مذكور أدناه في تعليق الإجابة ، وللمتعة ، عدت إلى هذه المشكلة وحاولت استخدامها كقائد XML أمام Elementtree ، لكنها حولت بشكل مسيء �
في بايت فارغ فقط. :-)
cleaned_s = StringIO(
BeautifulStoneSoup('<test><null>�</null><elem3>three</elem3></test>',
convertEntities=BeautifulStoneSoup.XML_ENTITIES
).renderContents()
)
tree = ElementTree.parse(cleaned_s)
... عائدات
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 12
في حالتي الخاصة ، لم أكن بحاجة حقًا إلى تحليل XPath على هذا النحو ، كان بإمكاني الذهاب مع BeautifulSoup نفسه وأسلوب التمثيل في العقدة البسيطة جدًا parsed_tree.test.elem1.contents[0]
.
المحلول
�
ليس في نطاق الشخصية القانونية المحددة بواسطة مواصفات XML. للأسف ، مهاراتي في بيثون بدائية إلى حد ما ، لذلك أنا لا أساعد كثيرًا هناك.
نصائح أخرى
�
ليس حرف XML صالح. من الناحية المثالية ، ستكون قادرًا على الحصول على منشئ الملف لتغيير عمليته بحيث لم يكن الملف غير صالح مثل هذا.
إذا كان يجب عليك قبول هذه الملفات ، فيمكنك إجراء معالجة مسبقًا للتشغيل �
في شيء آخر. على سبيل المثال ، اختر@كحرف الهروب ، قم بتحويل "@" إلى "@" ، و "و"�
"في"@0 ".
ثم عندما تحصل على بيانات النص من المحلل ، يمكنك عكس التعيين. هذا مجرد مثال ، يمكنك اختراع أي بناء جملة هروب تريده.