Используйте curl для анализа XML, получения URL изображения и его загрузки. - PullRequest
3 голосов
/ 03 августа 2010

Я хочу написать сценарий оболочки, чтобы получить изображение из RSS-канала. Прямо сейчас у меня есть:

curl http://foo.com/rss.xml | grep -E '<img src="http://www.foo.com/full/' | head -1 | sed -e 's/<img src="//' -e 's/" alt=""//' -e 's/width="400"//' -e 's/  height="400" \/>//' | sed 's/ //g'

Это я использую для получения первого вхождения URL изображения в файле. Теперь я хочу поместить этот URL в переменную, чтобы снова использовать cURL для загрузки изображения. Любая помощь приветствуется! (Также вы можете дать советы о том, как лучше удалить все из строки с URL. Это строка:

 <img src="http://www.nichtlustig.de/comics/full/100802.jpg" alt="" width="400" height="400" />

Вероятно, есть более подходящее регулярное выражение для удаления всего, кроме URL, чем мое решение.) Заранее спасибо!

Ответы [ 5 ]

2 голосов
/ 03 августа 2010

Использование регулярного выражения для разбора HTML / XML - это Плохая идея в целом .Поэтому я бы порекомендовал вам использовать правильный синтаксический анализатор.

Если вы не возражаете против использования Perl, пусть Perl выполнит правильный синтаксический анализ XML или HTML для вас, используя соответствующие библиотеки синтаксического анализатора:

HTML

curl http://BOGUS.com |& perl -e '{use HTML::TokeParser; 
    $parser = HTML::TokeParser->new(\*STDIN); 
    $img = $parser->get_tag('img') ; 
    print "$img->[1]->{src}\n"; 
}'

/content02/groups/intranetcommon/documents/image/blk_logo.gif

XML

curl http://BOGUS.com/whdata0.xml | perl -e '{use XML::Twig;
    $twig=XML::Twig->new(twig_handlers =>{img => sub { 
       print $_[1]->att("src")."\n"; exit 0;}}); 
    open(my $fh, "-");
    $twig->parse($fh);
}'

/content02/groups/intranetcommon/documents/image/blk_logo.gif
1 голос
/ 03 августа 2010

Я использовал wget вместо curl, но все равно

#!/bin/bash
url='http://www.nichtlustig.de/rss/nichtrss.rss'
wget -O- -q "$url" | awk 'BEGIN{ RS="</a>" }
/<img src=/{
  gsub(/.*<img src=\"/,"")
  gsub(/\".[^>]*>/,"")
  print
}'  |  xargs -i wget "{}"
0 голосов
/ 03 августа 2010

Вот быстрое решение Python:

from BeautifulSoup import BeautifulSoup
from os import sys

soup = BeautifulSoup(sys.stdin.read())
print soup.findAll('img')[0]['src']

Использование:

$ curl http://www.google.com/`curl http://www.google.com | python get_img_src.py`

Это работает как заклинание и не оставляет вас пытаться найти магическое регулярное выражение, которое будет анализировать случайный HTML ( Подсказка: такого выражения нет, особенно если у вас есть жадный сопоставитель типа sed. )

0 голосов
/ 03 августа 2010
#!/bin/sh
URL=$(curl http://foo.com/rss.xml | grep -E '<img src="http://www.foo.com/full/' | head -1 | sed -e 's/<img src="//' -e 's/" alt=""//' -e 's/width="400"//' -e 's/  height="400" \/>//' | sed 's/ //g')
curl -C - -O $URL

Это полностью делает работу! Любая идея о регулярном выражении?

0 голосов
/ 03 августа 2010

Используйте синтаксический анализатор DOM и извлеките все элементы img, используя getElementsByTagName. Затем добавьте их в список / массив, переберите и извлеките их отдельно.

Я бы предложил использовать Python, но любой язык имел бы библиотеку DOM.

...