Извлечение ссылок из карты сайта (xml)
Допустим, у меня есть 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
Как это сделать?
6 ответов
Вы можете использовать скрипт 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
Если вы используете Linux или что-то еще с помощью инструмента grep , вы можете просто запустить:
grep -Po 'http (s?): // [^ \ "() \ <>] *' sitemap.xml
Это может быть выполнено с помощью одной команды sed, которая кажется более надежной, чем решение grep:
sed '/<loc>/!d; s/[[:space:]]*<loc>\(.*\)<\/loc>/\1/' inputfile > outputfile
(находится по адресу: linuxquestions.org )
Решение 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>
Вы можете открыть свойsitemap.xml
файл в Notepad++.
Затем в меню Поиск → Заменить (CTRL+H) укажите:
Найти то, что:</loc>.*?<loc>
Заменить:\r\n
Установите режим поиска на регулярное выражение
а затем нажмитеReplace All
кнопка.
Дополнительно вы можете сортировать ссылки через Меню.Edit → Line Operations → Sort Lines in Ascending Order