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


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

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


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 )


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

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>

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.