<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://www.amadey-print.ru/</loc> <changefreq>1</changefreq> <lastmod>2</lastmod> </url> <url> <loc>http://www.amadey-print.ru/dostavka</loc> <lastmod>3</lastmod> <changefreq>4</changefreq> </url> <url> <loc>http://www.amadey-print.ru/faq</loc> <lastmod>5</lastmod> <changefreq>6</changefreq> </url> </urlset>
мне нужно обойти все теги url и удалить из них все теги, которые не являются тегом loc. Т.е lastmod,changefreq и другие если они там есть. Делал так:
from xml.etree import ElementTree as ET import re ET.register_namespace('', "http://www.sitemaps.org/schemas/sitemap/0.9") with open("sitemap.xml","r") as f: tree = ET.parse(f) root = tree.getroot() for element in root: for tag in element: if re.search('loc$',tag.tag) == None: element.remove(tag) tree.write('sitemap2.xml')
На другом форуме посоветовали другое решение:
import re import lxml.etree as ET from xml.etree.ElementTree import tostring xml_str = '''<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://www.amadey-print.ru/</loc> <changefreq>1</changefreq> <lastmod>2</lastmod> </url> <url> <loc>http://www.amadey-print.ru/dostavka</loc> <lastmod>3</lastmod> <changefreq>4</changefreq> </url> </urlset>''' root = ET.fromstring(xml_str.encode()) for element in root: for tag in element: if not re.search('loc$', tag.tag): # if 'loc' not in tag.tag: tag.getparent().remove(tag) print(tostring(root))
Как сделать нормально? Чтобы какой был xml код такой и остался только:
а) без лишних префиксов
б) без лишних тегов среди детей тега url