4

Допустим, у меня есть файл sitemap.xml с этими данными:

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

Я хочу извлечь из него все местоположения (данные между <loc> и </loc>).

Пример вывода будет как:

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

Как это сделать?

5 ответов5

7

Если вы используете Linux или что-то еще с помощью инструмента grep , вы можете просто запустить:

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

2

Это может быть выполнено с помощью одной команды sed, которая кажется более надежной, чем решение grep:

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

(находится по адресу: linuxquestions.org)

2

Вы можете использовать скрипт Python здесь

Этот скрипт получает любые ссылки, начинающиеся с 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

И в вашем случае следующий скрипт найдет все данные в тегах

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

Здесь хороший инструмент для игры с регулярным выражением, если вы не знакомы с ним.

если вам нужно загрузить удаленный файл, вы можете использовать следующий код

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
1

Используя XSLT , вы можете сделать это с помощью XPath

/url/loc
0

Решение 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>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .