Почему при парсе 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 шт):
В вашем коде получается, что в 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
Вот такой вариант внуреннего цикла работает. У Вас, во-первых, возвращается только результат разбора последнего элемента 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 :)