Wyodrębnij linki z mapy witryny (xml)

5

Powiedzmy, że mam sitemap.xmlplik z tymi danymi:

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

Chcę wyodrębnić z niego wszystkie lokalizacje (dane pomiędzy <loc>i </loc>).

Przykładowe dane wyjściowe będą takie jak:

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

Jak to zrobić?

Akshat Mittal
źródło
Z jakiego systemu operacyjnego korzystasz?
bobmagoo
Windows 7 Ultimate X64 / Windows 8 Pro X64 lub Ubuntu 12.04 Linux.
Akshat Mittal
Niezła konfiguracja. Korzystając z terminalu w polu Ubuntu, moja odpowiedź poniżej zapewni ci to, czego potrzebujesz.
bobmagoo
Możesz także użyć dowolnego edytora tekstu, takiego jak SublimeText2, który może używać wyrażenia regularnego, możesz uzyskać wszystkie dane, lub możesz użyć Pythona, patrz moja odpowiedź poniżej.
Ishikawa Yoshi

Odpowiedzi:

2

Tutaj możesz użyć skryptu python

Skrypt ten uruchamia wszelkie linki rozpoczynające się od 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

W twoim przypadku następny skrypt znajdzie wszystkie dane zawinięte w tagi

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

Oto fajne narzędzie do gry z wyrażeniem regularnym, jeśli go nie znasz.

jeśli chcesz załadować plik zdalny, możesz użyć następnego kodu

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
Ishikawa Yoshi
źródło
Jak załadować zdalny plik jak http://server.com/sitemap.xml. Nie jestem tak znany Pythonowi
Akshat Mittal
masz na myśli obciążenie pythonem?
Ishikawa Yoshi
Tak, tak jak f = open('sitemap.xml','r')przy otwieraniu pliku, jak otworzyć zdalny plik na serwerze http?
Akshat Mittal
aktualizuję swój post, musisz użyć modułu urllib2
Ishikawa Yoshi
Pokazuje błądAttributeError: 'list' object has no attribute 'findall'
Akshat Mittal
9

Jeśli korzystasz z Linux-a lub czegoś z narzędziem grep , możesz po prostu uruchomić:

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

bobmagoo
źródło
To działało, ale z dużą ilością błędów (niekompletne adresy URL).
Akshat Mittal
Dziwne, właśnie uruchomiłem to w pliku sitemap.xml Google i nie zauważyłem żadnych problemów. Których to przegapiło?
bobmagoo,
Brakowało wielu adresów URL zawierających „?” i „+”.
Akshat Mittal
Dziękuję Ci. Dla każdego, kto chce zapisać do plikugrep -Po 'http(s?)://[^ \"()\<>]*' sitemap.xml > links.txt
trante
+1 To jest naprawdę bardzo proste, ale potężne rozwiązanie.
SmallChess
2

Można to osiągnąć za pomocą pojedynczego polecenia sed, które wydaje się być bardziej solidne niż rozwiązanie grep:

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

(znaleziony na: linuxquestions.org )

LarS
źródło
Twoje rozwiązanie działa idealnie.
Baptiste Donaux 21.04.16
próbowałem go jako sed '/ <loc> /! d; s / [[: space:]] * <loc> (. *) <\ / loc> / \ 1 / 'sitemap.xml> links.txt, ale wyświetla tę samą zawartość xml. działało z powyższym poleceniem grep, ale próbuję dowiedzieć się, dlaczego to nie zadziałało
Mike
Myślę, że to dlatego, że nie uniknąłeś () z (i).
LarS
1

Za pomocą XSLTmożesz to wyrenderowaćXPath

/url/loc
Siva Charan
źródło
4
Czy możesz rozszerzyć swoją odpowiedź i pokazać instrukcje XSLT i zapytania XPath?
slhck
@slhck Dokładnie to, co chciałem powiedzieć, odpowiedź powinna być bardziej wyjaśniająca.
Akshat Mittal
Przeczytałem o tym jeszcze kilka i wreszcie to działa. Pozytywne, ale niezbyt dobra odpowiedź do wyboru.
Akshat Mittal
0

Rozwiązanie 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>
Jan Tomka
źródło
Od lat używam do tego wyrażeń regularnych itp., Ale XSLT jest w tym przypadku tak fajny :) Dla kompletnych noobów w XSLT (takich jak ja) fajnie byłoby dodać tylko to, co musisz zrobić: zapisać ten kod jako stylesheet.xsl i dodaj wiersz do dokumentu xml z linkiem do arkusza stylów <? xml-stylesheet type = "text / xsl" version = "1.0" href = "stylesheet.xsl"?> Następnie otwórz swój plik xml w przeglądarce (to nie będzie działać podczas otwierania jako plik lokalny, musisz go pobrać za pośrednictwem http)
Łukasz Rysiak