Questão Extrair links de um sitemap (xml)


Vamos dizer que eu tenho um sitemap.xml arquivo 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?


4


origem


Qual sistema operacional você está usando? - bobmagoo
Windows 7 Ultimate X64 / Windows 8 Pro X64 ou Ubuntu 12.04 Linux. - Akshat Mittal
Boa configuração. Usando o terminal na caixa do Ubuntu, minha resposta abaixo vai te dar o que você precisa. - bobmagoo
Você também pode usar qualquer editor de texto como o SublimeText2, que pode usar o regexp, você pode obter todos os dados com ele, ou você pode usar o python, veja minha resposta abaixo. - Ishikawa Yoshi


Respostas:


Você pode usar o script python aqui

Este script obtém todos os links iniciados com 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 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 boa ferramenta para jogar com regexp se você não estiver familiarizado com isso.

se você precisar carregar o arquivo remoto, você pode 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

2



Como carregar um arquivo remoto como http://server.com/sitemap.xml. Eu não sou tão conhecido por Python - Akshat Mittal
quer dizer carregar com python? - Ishikawa Yoshi
Sim, como você usou f = open('sitemap.xml','r') abrir o arquivo, como abrir um arquivo remoto no servidor http? - Akshat Mittal
eu atualizo meu post, você precisa usar o módulo urllib2 - Ishikawa Yoshi
Mostra erro AttributeError: 'list' object has no attribute 'findall' - Akshat Mittal


Se você está em uma caixa Linux ou algo com o grep ferramenta, você pode simplesmente executar:

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


7



Isso funcionou, mas com muitos erros (URLs incompletos). - Akshat Mittal
Estranho, eu acabei de falar disso Arquivo sitemap.xml do Google e não vi nenhum problema. Quais foram as saudades? - bobmagoo
Isso perdeu muitos URL que continha "?" e "+". - Akshat Mittal
Obrigado. Para alguém quer salvar para arquivar grep -Po 'http(s?)://[^ \"()\<>]*' sitemap.xml > links.txt - trante
+1 Esta é realmente uma solução muito simples, mas poderosa. - SmallChess


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>/\1/' inputfile > outputfile

(Encontrado em: linuxquestions.org)


2



Sua solução funciona perfeitamente. - Baptiste Donaux
tentei como sed '/ <loc> /! d; s / [[: space:]] * <loc> (. *) <\ / loc> / \ 1 / 'sitemap.xml> links.txt, mas gera o mesmo conteúdo xml. funcionou com o comando grep acima, mas estou tentando descobrir por que ele não funcionou - Mike
Eu acho que é porque você não escapou do () com (e). - LarS


Usando XSLT, você pode renderizar com XPath

/url/loc

1



Você poderia, talvez, expandir sua resposta e mostrar as instruções XSLT e as consultas XPath necessárias? - slhck
@slhck Exatamente o que eu queria dizer, a resposta deveria ser mais explicativa. - Akshat Mittal
Eu li um pouco mais sobre isso e finalmente comecei a trabalhar. Upvoting, mas não é uma boa resposta a ser escolhida. - Akshat Mittal


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>

0



Por anos eu venho usando regex etc. para isso, mas o XSLT é muito legal nesse caso :) Para noobs completos em XSLT (como eu) seria bom acrescentar que a única coisa que você tem que fazer é: salvar este código como stylesheet.xsl e adicione uma linha ao seu documento xml com o link para stylesheet <? xml-stylesheet type = "text / xsl" versão = "1.0" href = "stylesheet.xsl"?> Então abra seu xml no navegador (ele não vai funcionar quando abrir como arquivo local, você tem que obtê-lo via http) - Łukasz Rysiak