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.