IOError с функцией синтаксического анализа lxml etree

1

У меня есть логика вроде:

for root, dirs, files in os.walk(os.getcwd()):
    if "info.xml" in files:
        root = lxml.etree.parse("%s/info.xml" % root)
        tag = root.xpath("/info/tagname")[0].text

при синтаксическом анализе info.xml, который очень глубоко в текущем пути, встретил сообщение об ошибке:

    Traceback (most recent call last):
  File "/home/work/mergefile.py", line 365, in <module>
  File "/home/work/mergefile.py", line 344, in merge_ejb_files
  File "/home/work/mergefile.py", line 63, in __init__
  File "/home/work/mergefile.py", line 78, in _parse_info2doc
  File "lxml.etree.pyx", line 2698, in lxml.etree.parse (src/lxml/lxml.etree.c:49590)
  File "parser.pxi", line 1491, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:71205)
  File "parser.pxi", line 1520, in lxml.etree._parseDocumentFromURL (src/lxml/lxml.etree.c:71488)
  File "parser.pxi", line 1420, in lxml.etree._parseDocFromFile (src/lxml/lxml.etree.c:70583)
  File "parser.pxi", line 975, in lxml.etree._BaseParser._parseDocFromFile (src/lxml/lxml.etree.c:67736)
  File "parser.pxi", line 539, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:63820)
  File "parser.pxi", line 625, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:64741)
  File "parser.pxi", line 563, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:64056)
IOError: Error reading file '/home/work/ci/case/dc_daily/dc/213577/223922/223958/792536/info.xml': failed to load external entity "/home/work/ci/case/dc_daily/dc/213577/223922/223958/792536/info.xml"

но файл "/home/work/ci/case/dc_daily/dc/213577/223922/223958/792536/info.xml" существует, и я могу проанализировать его с помощью lxml в среде ipython IDE

Вы знаете, в чем проблема? Если вы это знаете, помогите мне, пожалуйста! Спасибо!

  • 1
    IIRC эта ошибка говорит вам, что lxml не удалось загрузить внешнюю сущность, которая указана в файле. Это могут быть DOCTYPE, схема, спецификации внешних объектов (и прочее). Можно загрузить документ без проверки соответствия схемы, что, в свою очередь, пропустит загрузку внешнего объекта. Должен быть какой-то параметр для parse функции. Извините, я сейчас немного занят, так что вы должны найти это сами :)
  • 0
    Спасибо за команду, сегодня, когда я отлаживаю эту проблему, я сначала открываю файл xml, затем вызываю lxml.etree.parse с дескриптором файла в качестве аргумента, при этом возникает ошибка IOError: Слишком много открытых файлов при открытии файла /home/work/ci/case/dc_daily/dc/213577/223922/223958/792536/info.xml , так что на самом деле это не проблема lxml, потому что Linux установлен только может открыть 1024 файла в одном процессе, я пытаюсь сделать это с подпроцессом
Показать ещё 1 комментарий
Теги:
parsing
lxml
ioerror

1 ответ

0

Здесь мое решение, согласно моему комментарию выше. Я открываю файлы для чтения, они закрывают их сразу после того, как я не удаляю ограничение по 1024 файлам.

import lxml.etree as etree
for root,dirs,files in os.walk(os.getcwd()):
    if "info.xml" in files:
        with open('%s/info.xml'%root) as processfile: #use 'rb' if necessary
            xml = etree.parse(processfile)
            tag = root.xpath("/info/tagname")[0].text

Ещё вопросы

Сообщество Overcoder
Наверх
Меню