Links aus einer Sitemap extrahieren (xml)

8795
Akshat Mittal

Nehmen wir an, ich habe eine sitemap.xmlDatei mit diesen Daten:

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

Ich möchte alle Standorte daraus extrahieren (Daten zwischen <loc>und </loc>).

Beispielausgabe wie:

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

Wie macht man das?

4
Welches Betriebssystem verwendest du? bobmagoo vor 11 Jahren 0
Windows 7 Ultimate X64 / Windows 8 Pro X64 oder Ubuntu 12.04 Linux. Akshat Mittal vor 11 Jahren 0
Schönes Setup. Wenn Sie Terminal in der Ubuntu-Box verwenden, erhalten Sie [meine Antwort unten] (http://superuser.com/a/466874/152250), was Sie benötigen. bobmagoo vor 11 Jahren 0
Sie können auch einen beliebigen Texteditor wie SublimeText2 verwenden, der regexp verwenden kann, Sie können alle Daten damit abrufen, oder Sie können Python verwenden. Siehe meine Antwort unten. Ishikawa Yoshi vor 11 Jahren 0

5 Antworten auf die Frage

7
bobmagoo

If you're on a Linux box or something with the grep tool, you can just run:

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

Dies funktionierte jedoch mit vielen Fehlern (unvollständige URLs). Akshat Mittal vor 11 Jahren 0
Seltsam, ich habe dies nur über die [Google sitemap.xml-Datei] (http://www.google.com/sitemap.xml) ausgeführt und keine Probleme festgestellt. Welche haben sie vermisst? bobmagoo vor 11 Jahren 0
Dies hat viele URLs verpasst, die "?" und "+". Akshat Mittal vor 11 Jahren 0
Vielen Dank. Für alle, die speichern möchten, speichern Sie die Datei `grep -Po 'http (s?): // [^ \" () \ <>] *' sitemap.xml> links.txt` trante vor 9 Jahren 0
+1 Dies ist eigentlich eine sehr einfache, aber leistungsfähige Lösung. SmallChess vor 8 Jahren 0
2
Ishikawa Yoshi

Sie können hier ein Python-Skript verwenden

Mit diesem Skript werden alle Links mit http gestartet

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 

Und in Ihrem Fall finden Sie im nächsten Skript alle Daten, die in Tags eingeschlossen sind

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 

Hier ein schönes Werkzeug, um mit Regex zu spielen, wenn Sie es nicht kennen.

Wenn Sie eine Remote-Datei laden möchten, können Sie den nächsten Code verwenden

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 
So laden Sie eine Remote-Datei wie "http: // server.com / sitemap.xml". Ich bin Python nicht so bekannt Akshat Mittal vor 11 Jahren 0
meinst du mit Python laden? Ishikawa Yoshi vor 11 Jahren 0
Wie, Sie haben wie folgt verwendet: f = open ('sitemap.xml', 'r') `, um die Datei zu öffnen. Wie öffnet man eine Remote-Datei auf einem http-Server? Akshat Mittal vor 11 Jahren 0
Ich aktualisiere meinen Beitrag. Sie müssen das Modul urllib2 verwenden Ishikawa Yoshi vor 11 Jahren 0
Zeigt den Fehler `AttributeError: 'list'-Objekt hat kein Attribut' findall'` Akshat Mittal vor 11 Jahren 0
importierst du ein re-Modul? Ishikawa Yoshi vor 11 Jahren 0
Lasst uns [diese Diskussion im Chat fortsetzen] (http://chat.stackexchange.com/rooms/4660/discussion-between-ishikawa-yoshi-and-akshat-mittal) Ishikawa Yoshi vor 11 Jahren 0
Sehr gute antwort! Eine Erinnerung daran, dass, wenn Ihre Links in HTTPS sind, * http * in * https * im Code geändert wird. George Chalhoub vor 5 Jahren 0
2
LarS

Dies könnte durch einen einzelnen sed-Befehl erreicht werden, der solider als die grep-Lösung zu sein scheint:

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

(gefunden bei: linuxquestions.org )

Ihre Lösung funktioniert perfekt. Baptiste Donaux vor 8 Jahren 0
versuchte es als sed '//! d; s / [[: space:]] *\ (. * \) <\ / loc> / \ 1 / 'sitemap.xml> links.txt, aber derselbe XML-Inhalt wird ausgegeben. es hat mit dem obigen grep-Befehl funktioniert, aber ich versuche herauszufinden, warum es nicht funktioniert hat Mike vor 7 Jahren 0
Ich denke es liegt daran, dass Sie das () nicht mit \ (und \) entkommen haben. LarS vor 7 Jahren 0
1
Siva Charan

Using XSLT, you can render it out with XPath

/url/loc 
Könnten Sie vielleicht Ihre Antwort erweitern und die XSLT-Anweisungen und die benötigten XPath-Abfragen anzeigen? slhck vor 11 Jahren 4
@slhck Genau das, was ich sagen wollte, sollte die Antwort erklärender sein. Akshat Mittal vor 11 Jahren 0
Ich habe noch ein paar mehr darüber gelesen und habe endlich gearbeitet. Upvoting, aber keine wirklich gute Antwort. Akshat Mittal vor 11 Jahren 0
0
Jan Tomka

The XSLT solution:

<?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> 
Ich habe seit Jahren Regex usw. verwendet, aber XSLT ist in diesem Fall so cool :) Für komplette Noobs in XSLT (wie ich) wäre es schön, das einzige hinzuzufügen, was Sie tun müssen: Speichern Sie diesen Code als stylesheet.xsl und füge eine Zeile zu deinem XML-Dokument mit einem Link zu Stylesheet hinzu. Öffne dann deine XML im Browser (es funktioniert nicht beim Öffnen als lokale Datei, du musst es über http bekommen) Łukasz Rysiak vor 7 Jahren 0