Estrai i collegamenti da una sitemap (xml)

Diciamo di avere un file sitemap.xml con questi dati:

 <url> <loc>http://domain.com/pag1</loc> <lastmod>2012-08-25</lastmod> <changefreq>weekly</changefreq> <priority>0.9</priority> </url> <url> <loc>http://domain.com/pag2</loc> <lastmod>2012-08-25</lastmod> <changefreq>weekly</changefreq> <priority>0.9</priority> </url> <url> <loc>http://domain.com/pag3</loc> <lastmod>2012-08-25</lastmod> <changefreq>weekly</changefreq> <priority>0.9</priority> </url> 

Voglio estrarre tutte le posizioni da essa (dati tra <loc> e </loc> ).

L'esempio di output è come:

 http://domain.com/pag1 http://domain.com/pag2 http://domain.com/pag3 

Come fare questo?

Qui puoi usare script python

Questo script ottiene tutti i collegamenti iniziati con http

 import re f = open('sitemap.xml','r') res = f.readlines() for d in res: data = re.findall('>(http:\/\/.+)<',d) for i in data: print i 

E nel tuo caso, il seguente script trova tutti i dati avvolti nei tag

 import re f = open('sitemap.xml','r') res = f.readlines() for d in res: data = re.findall('<loc>(http:\/\/.+)<\/loc>',d) for i in data: print i 

Qui è un bel strumento per giocare con regexp se non ne avrai familiarità.

se è necessario caricare il file remoto è ansible utilizzare il codice successivo

 import urllib2 as ur import re f = ur.urlopen(u'http://server.com/sitemap.xml') res = f.readlines() for d in res: data = re.findall('<loc>(http:\/\/.+)<\/loc>',d) for i in data: print i 

Se sei in una casella Linux o qualcosa con lo strumento grep , puoi eseguire semplicemente:

grep -Po 'http (s?): // [^ \ "() \ <>] *' sitemap.xml

Utilizzando XSLT , è ansible renderlo con XPath

 /url/loc 

Ciò potrebbe essere compiuto da un unico command sed, che sembra essere più solido della soluzione grep:

 sed '/<loc>/!d; s/[[:space:]]*<loc>\(.*\)<\/loc>/\1/' inputfile > outputfile 

(trovato a: linuxquestions.org )

La soluzione XSLT:

 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="http://www.sitemaps.org/schemas/sitemap/0.9"> <xsl:output method="text" /> <xsl:template match="s:url"> <xsl:value-of select="s:loc" /> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet>