Найти - Пользователи
Полная версия: Как удалять теги fb2? При сохранении лишнее в файле
Начало » Python для новичков » Как удалять теги fb2? При сохранении лишнее в файле
1
Novator
И снова здравствуйте!
Теперь я пытаюсь понять, как можно удалить теги с файла 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>
Что за ns0, ns1? Они по всем тегам файла, и как следствие - структуры документа больше нет
Novator
Добавил эту функцию:
 def remove_namespaces(tree):
	for el in tree.getiterator():
		match = re.match("^(?:\{.*?\})?(.*)$", el.tag)
		if match:
			el.tag = match.group(1)
Стало лучше, но не везде
Читал, что вроде надо использовать это:
 ET.register_namespace
Но не понял, куда вписать эту регистрацию пространств имен. Написано, что перед чтением файла/строки, но у меня толку не было
Novator
Разобрался.
 ET.register_namespace("", "http://www.gribuser.ru/xml/fictionbook/2.0")
ET.register_namespace("l", "http://www.w3.org/1999/xlink")
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB