Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 17, 2015 21:36:10

rayzor
Зарегистрирован: 2015-10-17
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

удаление тегов в xml

есть такой файл 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

Отредактировано rayzor (Окт. 17, 2015 21:36:42)

Офлайн

#2 Окт. 18, 2015 02:46:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

удаление тегов в xml

>>> 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>
>>>



Отредактировано py.user.next (Окт. 18, 2015 02:47:45)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version