Вопрос Извлечь ссылки из файла Sitemap (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

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


4
2017-08-27 11:11


происхождения


Какую ОС вы используете? - bobmagoo
Windows 7 Ultimate X64 / Windows 8 Pro X64 или Ubuntu 12.04 Linux. - Akshat Mittal
Хорошая настройка. Используя терминал в поле Ubuntu, мой ответ ниже вы получите то, что вам нужно. - bobmagoo
Вы также можете использовать любой текстовый редактор, такой как SublimeText2, который может использовать regexp, вы можете получить с ним все данные, или вы можете использовать python, см. Мой ответ ниже. - Ishikawa Yoshi


ответы:


Вы можете использовать скрипт 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

2
2017-08-27 12:00



Как загрузить удаленный файл, например http://server.com/sitemap.xml, Я не настолько известен Python - Akshat Mittal
вы имеете в виду загрузку с помощью python? - Ishikawa Yoshi
Yup, Как вы использовали f = open('sitemap.xml','r') для открытия файла. Как открыть удаленный файл на http-сервере? - Akshat Mittal
я обновляю свой пост, вам нужно использовать модуль urllib2 - Ishikawa Yoshi
Показывает ошибку AttributeError: 'list' object has no attribute 'findall' - Akshat Mittal


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

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


7
2017-08-27 11:40



Это сработало, но с большим количеством ошибок (Неполный URL-адрес). - Akshat Mittal
Странно, я просто побежал Файл sitemap.xml от Google и не видел никаких проблем. Какие из них пропустили? - bobmagoo
Это пропустило многие URL-адреса, содержащие «?» и "+". - Akshat Mittal
Спасибо. Для кого угодно, чтобы сохранить файл grep -Po 'http(s?)://[^ \"()\<>]*' sitemap.xml > links.txt - trante
+1 Это на самом деле очень простое, но мощное решение. - SmallChess


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

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

(найдено по адресу: linuxquestions.org)


2
2017-08-27 11:39



Ваше решение работает отлично. - Baptiste Donaux
попробовал его как sed '/ <loc> /! d; s / [[: space:]] * <loc> (. *) <\ / loc> / \ 1 / 'sitemap.xml> links.txt, но он выводит одно и то же содержимое xml. он работал с командой grep выше, но я пытаюсь понять, почему это не сработало - Mike
Я думаю, это потому, что вы не избежали () с (и). - LarS


С помощью XSLT, вы можете визуализировать его с помощью XPath

/url/loc

1
2017-11-25 01:01



Не могли бы вы расширить свой ответ и показать инструкции XSLT и запросы XPath? - slhck
@slhck То, что я хотел сказать, ответ должен быть более объяснительным. - Akshat Mittal
Я прочитал еще несколько об этом и наконец занялся этой работой. Упреждающий, но не очень хороший ответ, который нужно выбрать. - Akshat Mittal


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

0



В течение многих лет я использовал regex и т. Д. Для этого, но XSLT в этом случае так классно :) Для полных noobs в XSLT (например, я) было бы неплохо добавить, что вам нужно только что: сохранить этот код как stylesheet.xsl и добавить строку в ваш XML-документ со ссылкой на таблицу стилей <? xml-stylesheet type = "text / xsl" version = "1.0" href = "stylesheet.xsl"?> Затем откройте свой XML в браузере (он не будет работать при открытии в качестве локального файла, вы должны получить его через http) - Łukasz Rysiak