Форум сайта python.su
И снова здравствуйте!
Теперь я пытаюсь понять, как можно удалить теги с файла fb2 c их содержимым.
Но коленке слепил, из того что было:
def run(): root = ET.parse('book.fb2') rootTag = root.getroot().tag namespaces = { '': re.match(r'^\{([^\}]+)\}', rootTag).group(1) } authorEls = root.findall('description/title-info/author', namespaces) res = [] for authorEl in authorEls: firstName = authorEl.find('first-name', namespaces).text middleName = authorEl.find('middle-name', namespaces) if middleName is not None: authorEl.remove(middleName) middleName = None else: middleName = None lastName = authorEl.find('last-name', namespaces).text if middleName is None: out = '{} {}'.format(firstName, lastName) else: out = '{} {} {}'.format(firstName, middleName, lastName) res.append(out) root.write('book.fb2', encoding='UTF-8') print ('ok')
<?xml version="1.0" encoding="UTF-8"?> <FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"> <description> <title-info> <genre>thriller</genre> <author> <first-name>Роберт</first-name> <last-name>Артур</last-name> </author> <author> <first-name>Роальд</first-name> <last-name>Даль</last-name> </author> <author> <first-name>Гарри</first-name> <last-name>Гаррисон</last-name> </author> <author> <first-name>Генри</first-name> <last-name>Каттнер</last-name> </author> <author> <first-name>Тэлмидж</first-name> <last-name>Пауэлл</last-name> </author> <author> <first-name>Деннис</first-name> <last-name>Уитли</last-name> </author> <author> <first-name>Роберт</first-name> <middle-name>Альберт</middle-name> <last-name>Блох</last-name> </author>
<ns0:FictionBook xmlns:ns0="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:ns1="http://www.w3.org/1999/xlink"> <ns0:description> <ns0:title-info> <ns0:genre>thriller</ns0:genre> <ns0:author> <ns0:first-name>Роберт</ns0:first-name> <ns0:last-name>Артур</ns0:last-name> </ns0:author> <ns0:author> <ns0:first-name>Роальд</ns0:first-name> <ns0:last-name>Даль</ns0:last-name> </ns0:author> <ns0:author> <ns0:first-name>Гарри</ns0:first-name> <ns0:last-name>Гаррисон</ns0:last-name> </ns0:author> <ns0:author> <ns0:first-name>Генри</ns0:first-name> <ns0:last-name>Каттнер</ns0:last-name> </ns0:author> <ns0:author> <ns0:first-name>Тэлмидж</ns0:first-name> <ns0:last-name>Пауэлл</ns0:last-name> </ns0:author> <ns0:author> <ns0:first-name>Деннис</ns0:first-name> <ns0:last-name>Уитли</ns0:last-name> </ns0:author> <ns0:author> <ns0:first-name>Роберт</ns0:first-name> <ns0:last-name>Блох</ns0:last-name> </ns0:author>
Отредактировано Novator (Май 11, 2022 21:31:17)
Офлайн
Добавил эту функцию:
def remove_namespaces(tree): for el in tree.getiterator(): match = re.match("^(?:\{.*?\})?(.*)$", el.tag) if match: el.tag = match.group(1)
ET.register_namespace
Офлайн
Разобрался.
ET.register_namespace("", "http://www.gribuser.ru/xml/fictionbook/2.0") ET.register_namespace("l", "http://www.w3.org/1999/xlink")
Офлайн