6

Lets say I have a sitemap.xml file with this data:

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

I want to extract all the locations from it (data between <loc> and </loc>).

Sample output be like:

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

How to do this?

4
  • What OS are you using?
    – bobmagoo
    Aug 27, 2012 at 11:35
  • Windows 7 Ultimate X64 / Windows 8 Pro X64 or Ubuntu 12.04 Linux. Aug 27, 2012 at 13:13
  • Nice setup. Using Terminal on the Ubuntu box, my answer below will get you what you need.
    – bobmagoo
    Aug 27, 2012 at 13:22
  • You can also use any text editor like SublimeText2 which can use regexp, you can get all data with it, or you can use python see my answer below. Aug 27, 2012 at 14:35

6 Answers 6

2

You can use python script here

This script get any links started with 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

And in your case next script find all data wraped in 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

Here nice tool to play with regexp if you not familiar with it.

if you need to load remote file you can use next code

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
8
  • How to load a remote file like http://server.com/sitemap.xml. I am not so known to Python Aug 28, 2012 at 14:09
  • you mean load with python? Aug 28, 2012 at 14:14
  • Yup, Like you have used f = open('sitemap.xml','r') to open the file, How to open a remote file on http server? Aug 28, 2012 at 14:16
  • i update my post, you need to use urllib2 module Aug 28, 2012 at 14:22
  • Shows error AttributeError: 'list' object has no attribute 'findall' Aug 28, 2012 at 14:33
9

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

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

5
  • This worked but with a lot of mistakes (Incomplete URL's). Aug 28, 2012 at 13:46
  • Weird, I just ran this over Google's sitemap.xml file and didn't see any issues. Which ones did it miss?
    – bobmagoo
    Aug 29, 2012 at 17:46
  • This missed many url's that contained "?" and "+". Aug 30, 2012 at 9:50
  • Thank you. For anybody wants to save to file grep -Po 'http(s?)://[^ \"()\<>]*' sitemap.xml > links.txt
    – trante
    Sep 18, 2014 at 11:51
  • +1 This is actually a very simple but powerful solution.
    – SmallChess
    May 10, 2015 at 13:06
2

This could be accomplished by a single sed command, which seems to be more solid than the grep solution:

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

(found at: linuxquestions.org)

3
  • Your solution works perfectly. Apr 21, 2016 at 19:36
  • tried it as sed '/<loc>/!d; s/[[:space:]]*<loc>(.*)<\/loc>/\1/' sitemap.xml > links.txt but it outputs the same xml content. it worked with the above grep command but I am trying to figure out why it did not work
    – Mike
    Apr 26, 2017 at 8:27
  • I think it's because you did not escape the () with ( and ).
    – LarS
    Apr 26, 2017 at 21:03
1

Using XSLT, you can render it out with XPath

/url/loc
3
  • 4
    Could you maybe expand your answer and show the XSLT instructions and the XPath queries needed?
    – slhck
    Aug 27, 2012 at 14:44
  • @slhck Exactly what I wanted to say,The answer should be more explainatory. Aug 28, 2012 at 9:28
  • I read a few more about this and got this working at last. Upvoting but not a really good answer to be choosen. Aug 28, 2012 at 13:56
0

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>
1
  • For years i've been using regex etc. for this but XSLT is so cool in this case :) For complete noobs in XSLT (like me) it'd be nice to add that only thing you have to do is: save this code as stylesheet.xsl and add a row to your xml document with link to stylesheet <?xml-stylesheet type="text/xsl" version="1.0" href="stylesheet.xsl"?> Then open your xml in browser (it won't work when opening as local file, you have to get it via http) Aug 8, 2016 at 12:41
0

You can open your sitemap.xml file in Notepad++.

Then in the menu Search → Replace (CTRL+H) specify:

Find what: </loc>.*?<loc>

Replace with: \r\n

Set Search mode to Regular Expression

and then click Replace All button.

Additionally you can sort the links via the Menu Edit → Line Operations → Sort Lines in Ascending Order

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .