BeautifulSoup4 не принимает действительный XML - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь открыть действительный XML-файл, разобрать его с помощью lxml-xml, предварительно откорректировать и, наконец, сохранить в другом файле.

Мой код выглядит следующим образом:

def main(path_to_config):
    with open(f'configs/{path_to_config}', 'r') as file:
        contents = file.read()
        soup = BeautifulSoup(contents, 'xml')
        with open(f'pretty_xml/{path_to_config.split("_")[0]}.xml', 'w') as new_file:
            new_file.write(soup.prettify())

К сожалению, независимо от того, что помещено в файл, анализ не будет генерировать действительный xml. Одна строка <?xml version="1.0" encoding="utf-8"?> - это все, что сохраняется в файлах pretty_config/. Я проверил с помощью нескольких онлайн-валидаторов, что передаваемый мною xml действителен.

Я попытался заменить file.read() только файлом, не повезло. Я также попытался заменить это просто строкой xml, которая работает и проверяет, работает ли мой синтаксический анализатор и происходит ли разрыв между открытием файла и передачей содержимого в BeautifulSoup.

Любая помощь в этом будеточень ценится.

ОБНОВЛЕНИЕ:

Мой xml-файл состоит из одной строки, <note><time>twelve</time></note>.

В качестве проверки работоспособности я добавил assert contents == '<note><time>twelve</time></note>', как при передаче строки в BeautifulSoup у парсера проблем нет. Эта новая строка выкинула AssertionError, что я совершенно не знаю, как. Разве строки не должны быть идентичными? Я скопировал строку из файла .py прямо в файл .xml, никаких дополнительных пробелов и других символов нет.

1 Ответ

1 голос
/ 09 октября 2019

В начале моего файла была спецификация, которая не была перезаписана путем вставки копии из файла .py в файл .xml.

Я обнаружил это благодаря предложению @ snakecharmerb использовать repr(contents) для просмотра истинного представления моей строки и обнаружил, что значение было '\'\\ufeff<note><time>twelve</time></note>\''. \ Ufeff - это BOM , и его необходимо удалить.

Я добавил следующие строки в начало своей функции, и это исправляет ошибку.

s = open(f'configs/{path_to_config}', mode='r', encoding='utf-8-sig').read()
open(f'configs/{path_to_config}', mode='w', encoding='utf-8').write(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...