Я учусь кодировать на python. Для начала я приступил к упражнению, чтобы преобразовать ток PDF в XML.Упражнение оказалось сложнее, чем я себе представлял.Вот мой код:
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pathlib import Path
from xml.etree.ElementTree import Element, SubElement
from xml.etree import ElementTree
from xml.dom import minidom
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ElementTree.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
pdfDoc = Path(r'<path of the pdf document>')
fp = open(pdfDoc, 'rb')
parser = PDFParser(fp)
doc = PDFDocument(parser)
outlines = doc.get_outlines()
docLevel = 0
previouslevel = 0
docLevelList = dict()
prevCh = ""
xDoc = Element("root")
for (level, title, dest, a, se) in outlines:
if title == "Contents":
pass
else:
currCh = title.split(" ",1)[0]
if len(docLevelList) == 0 and level == 1:
docLevelList["ch_"+currCh] = "root"
previouslevel = level
prevCh = currCh
child = SubElement(xDoc, sorted(docLevelList.keys())[-1])
child.text = title.split(" ",1)[1]
elif len(docLevelList) != 0 and level == 1 and level < previouslevel:
docLevelList["ch_"+currCh] = "root"
previouslevel = level
prevCh = currCh
child = SubElement(xDoc, sorted(docLevelList.keys())[-1])
child.text = title.split(" ",1)[1]
elif len(docLevelList) != 0 and level == 1 and int(currCh) == int (prevCh) + 1:
docLevelList["ch_"+currCh] = "root"
previouslevel = level
prevCh = currCh
child = SubElement(xDoc, sorted(docLevelList.keys())[-1])
child.text = title.split(" ",1)[1]
#print(docLevelList, previouslevel, prevCh)
elif len(docLevelList) != 0 and level > previouslevel and prevCh in currCh:
docLevelList["ch_"+currCh] = "ch_"+prevCh
previouslevel = level
prevCh = currCh
child = SubElement(docLevelList.get(sorted(docLevelList.keys())[-1]), sorted(docLevelList.keys())[-1])
child.text = title.split(" ",1)[1]
elif len(docLevelList) != 0 and level == previouslevel and int(prevCh[-1]) + 1 == int(currCh[-1]):
docLevelList["ch_"+currCh] = docLevelList.get("ch_"+prevCh)
#docLevelList["ch_"+currCh] = list(docLevelList.keys())[list(docLevelList.values()).index("ch_"+prevCh)]
previouslevel = level
prevCh = currCh
child = SubElement(docLevelList.get(sorted(docLevelList.keys())[-1]), sorted(docLevelList.keys())[-1])
child.text = title.split(" ",1)[1]
print (prettify(xDoc))
Бит docLevelList.get (sorted (docLevelList.keys ()) [- 1]) в вызове SubElement создает ошибку TypeError.
Из сообщения об ошибке я узнал, что родитель должен быть элементом элемента, но у меня закончились идеи.Помогите!!!Кроме того, любые другие предложения по улучшению приветствуются.Пожалуйста, извините за жалкий код.