Почему при парсе XML (FB2) значение строки пустое

Ночь добрая. Я написал такой класс для того чтобы парсить XML:

from xml.dom.minidom import parse
from xml.dom import minidom

class Book(object):

    def __init__(self, filename):
        self.filename = filename

    def parse(self):
        with open(self.filename, "r", encoding="UTF-8") as document:
            document = parse(document)
            print(document.version, document.encoding, document.standalone)
            paragraphs = document.getElementsByTagName("section")
            for paragraph in paragraphs:
                text_nodes = [
                    node.nodeValue for node in paragraph.childNodes
                    if node.nodeType == minidom.Node.TEXT_NODE
                ]
                text = "".join(text_nodes)
            return text

когда я вывожу результат, то там пустая строка. Сам fb2-файл корректен, его открывают программы. Но у меня не работает. Почему так?


Ответы (2 шт):

Автор решения: CrazyElf

В вашем коде получается, что в text_nodes и затем в text оказывается только содержание самого последнего параграфа, потому что эти переменные присваиваются заново на каждой итерации цикла. Если вы хотите увидеть содержание всех параграфов, то нужно собрать в список text_nodes по всем параграфам, а не только по последнему, и преобразовать их в text уже после окончания цикла:

            text_nodes = [] 
            for paragraph in paragraphs:
                text_nodes.extend([
                    node.nodeValue for node in paragraph.childNodes
                    if node.nodeType == minidom.Node.TEXT_NODE
                ])
            text = "".join(text_nodes)
            return text
→ Ссылка
Автор решения: Alex Titov

Вот такой вариант внуреннего цикла работает. У Вас, во-первых, возвращается только результат разбора последнего элемента section (т.е. text "не накапливается"), во-вторых, надо для извлечения текста опуститься еще на уровень "вглубь"

        text = ""
        for paragraph in paragraphs:
            text_nodes = [
                node.childNodes[0].nodeValue for node in paragraph.childNodes
                if node.nodeName == 'p' and node.childNodes[0].nodeValue
            ]
            text += "".join(text_nodes)
        return text

P.S. Не надо бы результат поиска по элементам sections называть paragraphs :)

→ Ссылка