Extrair links de um sitemap (xml)

4

Digamos que eu tenha um arquivo sitemap.xml com esses dados:

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

Eu quero extrair todos os locais dele (dados entre <loc> e </loc> ).

A saída da amostra é como:

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

Como fazer isso?

    
por Akshat Mittal 27.08.2012 / 13:11

5 respostas

2

Você pode usar o script python aqui

Este script obtém todos os links iniciados com link

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 no seu caso, o próximo script encontra todos os dados em tags

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

Aqui uma boa ferramenta para brincar com o regexp se você não estiver familiarizado com ele.

se você precisar carregar um arquivo remoto, poderá usar o próximo código

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
    
por 27.08.2012 / 14:00
7

Se você estiver em uma caixa Linux ou algo com a ferramenta grep , basta executar:

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

    
por 27.08.2012 / 13:40
2

Isso pode ser feito por um único comando sed, que parece ser mais sólido que a solução grep:

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

(encontrado em: linuxquestions.org )

    
por 07.08.2015 / 17:55
1

Usando XSLT , você pode renderizar com XPath

/url/loc
    
por 27.08.2012 / 13:39
0

A solução 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>
    
por 25.11.2015 / 02:01