2015-12-23 4 views
0

У меня есть Баш скрипт, который получает все файлы XML из robots.txt файла и печатает ответы HTTP сервера для выходного файла:Bash - Карта сайт XML теста, LOC

#!/usr/bin/env bash 

#usage ./script.sh robots.txt 

while read url 
do 
    urlstatus=$(curl -o /dev/null --silent --head --write-out '{http_code}' "$url") 
    echo "$url $urlstatus" >> results.txt 
done < $1 

образца роботов .txt может выглядеть так:

http://www.youraddress.com/file1.xml 
http://www.youraddress.com/file2.xml 
http://www.youraddress.com/file3.xml 

Пример выход:

http://www.youraddress.com/file1.xml 200 
http://www.youraddress.com/file2.xml 200 
http://www.youraddress.com/file3.xml 200 

Но каждый XML-файл имеет внутри loc теги.

Внутри XML:

<url> 
<loc> 
    http://myother.address.com/ 
</loc> 
<changefreq>daily</changefreq> 
<priority>0.8</priority> 

Все, что мне нужно сделать, чтобы получить от каждого файла: file1, file2 ... каждый URL из Loc теги и печати также ответ HTTP-сервера ,

Может кто-нибудь мне подскажет, поможет ли код, основанный на этом скрипте?

+0

Вы хотите код HTTP и '' значение из извлеченного URL? Вместо исходного URL и HTTP-кода? Вы пробовали что-нибудь для этого? (Вам нужно будет отказаться от удаления документа, который вы загружаете как начало.) –

+0

@EtanReisner значения состоят из URL-адресов, поэтому я также хочу получить ответы этих ссылок. Если ОК - 200, иначе 404. –

+0

просто попробуйте, вы хотите извлечь url внутри loc и сделать некоторые завитки с ним? – sjsam

ответ

0

Я бы подумал об использовании xmllint --noout "$ url", чтобы убедиться, что XML не содержит в себе синтаксических ошибок.

Robots.text будет иметь линии в нем, как Разрешить /, или должен, и поэтому вам нужно получить только те, которые вы хотите, может быть, с

sed -n -e 's/^ *sitemap: *//p' 

Для обработки XML, вы может использовать XSLT, например

<xsl:stylesheet 
    mlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <!--* extract URLs one per line from loc elements; 
     * match loc in any namespace (XSLT 1 method): 
     *--> 
    <xsl:template match="*[name() = 'loc']"> 
    <xsl:value-of select="."/> 
    <xsl:text>&#xa;</xsl:text><!--* newline *--> 
    </xsl:template> 

    <xsl:template match="*"><xsl:apply-templates/></xsl:template> 
    <xsl:template match="text()"></xsl:template> 
</xsl:stylesheet> 

(вы можете запустить это с помощью команды xsltproc). Или напишите все на Perl или python с помощью одного из модулей XML.

Не пытайтесь разобрать XML, используя оболочку.

0

Вы могли бы что-то, как показано ниже:

url=$(wget -q -O - /dev/stdout test.web/xml1.xml | sed -n "/\<loc>/{n;p;q}"); 
#do some curl stuff with the $url as you wish 
+0

Это предполагает, что существует только одно «местоположение» для xml-файла. – sjsam