Найти - Пользователи
Полная версия: удаление тегов в xml
Начало » Python для новичков » удаление тегов в xml
1
rayzor
есть такой файл xml:
<?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 код с префиксами xmlns:ns0="http://www.sitemaps.org/schemas/sitemap/0.9"
Как сделать нормально? Чтобы какой был xml код такой и остался только:
а) без лишних префиксов
б) без лишних тегов среди детей тега url
py.user.next
>>> from xml.etree import ElementTree as ET
>>> 
>>> s = '''\
... <?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>'''
>>> 
>>> root = ET.fromstring(s)
>>> 
>>> for i in root:
...     while len(i) > 1:
...         del i[-1]
... 
>>> ET.register_namespace('', 'http://www.sitemaps.org/schemas/sitemap/0.9')
>>> out = ET.tostring(root, encoding='unicode')
>>> 
>>> print(out)
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
    <loc>http://www.amadey-print.ru/</loc>
    </url>
<url>
    <loc>http://www.amadey-print.ru/dostavka</loc>
        </url>
<url>
    <loc>http://www.amadey-print.ru/faq</loc>
        </url>
</urlset>
>>>
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