Извлечение ссылок из карты сайта (xml)

8652
Akshat Mittal

Допустим, у меня есть 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
Какую ОС вы используете? bobmagoo 11 лет назад 0
Windows 7 Ultimate X64 / Windows 8 Pro X64 или Ubuntu 12.04 Linux. Akshat Mittal 11 лет назад 0
Хорошая настройка. Используя Terminal в окне Ubuntu, [мой ответ ниже] (http://superuser.com/a/466874/152250) даст вам то, что вам нужно. bobmagoo 11 лет назад 0
Вы также можете использовать любой текстовый редактор, такой как SublimeText2, который может использовать регулярное выражение, вы можете получить все данные с ним, или вы можете использовать python, см. Мой ответ ниже. Ishikawa Yoshi 11 лет назад 0

5 ответов на вопрос

7
bobmagoo

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

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

Это сработало, но с большим количеством ошибок (неполные URL). Akshat Mittal 11 лет назад 0
Странно, я только что проверил это [файл sitemap.xml Google] (http://www.google.com/sitemap.xml) и не увидел никаких проблем. Какие из них пропустили? bobmagoo 11 лет назад 0
Это пропустил много URL, которые содержали "?" и "+". Akshat Mittal 11 лет назад 0
Спасибо. Никто не хочет сохранить в файл `grep -Po 'http (s?): // [^ \" () \ <>] *' sitemap.xml> links.txt` trante 9 лет назад 0
+1 Это на самом деле очень простое, но мощное решение. SmallChess 8 лет назад 0
2
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 
Как загрузить удаленный файл типа `http: // server.com / sitemap.xml`. Я не так известен Python Akshat Mittal 11 лет назад 0
ты имеешь ввиду загрузку с питона? Ishikawa Yoshi 11 лет назад 0
Да, как вы использовали `f = open ('sitemap.xml', 'r')`, чтобы открыть файл, Как открыть удаленный файл на http-сервере? Akshat Mittal 11 лет назад 0
я обновляю свой пост, вам нужно использовать модуль urllib2 Ishikawa Yoshi 11 лет назад 0
Показывает ошибку `AttributeError: у объекта 'list' нет атрибута 'findall'` Akshat Mittal 11 лет назад 0
Вы импортируете повторно модуль? Ishikawa Yoshi 11 лет назад 0
позвольте нам [продолжить это обсуждение в чате] (http://chat.stackexchange.com/rooms/4660/discussion-between-ishikawa-yoshi-and-akshat-mittal) Ishikawa Yoshi 11 лет назад 0
Очень хороший ответ! Напоминаем, что если ваши ссылки находятся в HTTPS, измените * http * на * https * в коде). George Chalhoub 5 лет назад 0
2
LarS

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

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

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

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

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

/url/loc 
Не могли бы вы расширить свой ответ и показать инструкции XSLT и необходимые запросы XPath? slhck 11 лет назад 4
@slhck Именно то, что я хотел сказать, ответ должен быть более объяснительным. Akshat Mittal 11 лет назад 0
Я прочитал немного больше об этом и получил это, наконец, работает. Проголосование, но не очень хороший ответ для выбора. Akshat Mittal 11 лет назад 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> 
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 Then open your xml in browser (it won't work when opening as local file, you have to get it via http) Łukasz Rysiak 7 лет назад 0

Похожие вопросы