Bir desene göre bir dosya kümesini nasıl indirebilirim?


0

İşte yapmaya çalıştığım şey:

  1. Bir web sayfasını indirin
  2. İçinde bir regex ile eşleşen tüm dizeleri bul
  3. Tamamen nitelikli URL'ler oluşturmak için bunlara dizgi sabitlerini ekleyin ve ekleyin
  4. Hepsini indir

Bu kolay olmalı! Bir demet curl ve grep Borular ile sinirli yeterli olmalı, ama yapamam!

curl http://example.com/?q=blah | grep -o -P "(?<=alt=\")[^\"]*\"" | what's next?

Ayrıca, grep tanıdığı görünmüyor [^\"].

DownThemAll gibi şeyler! yeterince esnek değiller.



1
Web sayfasının HTML içerdiğini söylemedim. Ayrıştırmak istediğimi söylemedim.
Ansis Māliņš

Bağlantı az çok bir şakaydı. Veri / HTML'nin nasıl göründüğüne dair çok iyi bir fikriniz varsa, genellikle regexps ile çalışmasını sağlamak mümkündür. Sadece başaramazsın güçlü (Şimdi ve sonra bir başarısızlık beklemeniz gerekir).
Nifle

Ne tür ipleri yakalamak istediğinizi anlamada bir sorunum var. Birkaç örnek verebilir misiniz?
Nifle

Tüm alt özelliklerin içeriğini bulmak istiyorum. alt = "& lt; bunu bulmak istiyorum & gt;" Dosya isimleri içeriyorlar.
Ansis Māliņš

Yanıtlar:


1

Grep'ten vazgeçtim. Umarım bir perl çözümü tamamdır.

bukle http://example.com/?q=blah | perl -e '@ alt = harita {/alt="(.*?)"/ig}; "$ _ \ n" foreach (@alt) 'i yazdır

bu girdi verilir:

afk alt="<I want to find this>" easdfg alt="<I want to find that>" 
adsfsgw wt er ger 
ekfj er  alt="<I want to find this other>" alt="<I want to find this anotherthing>" fgerg
ey 
 ty rth
<img src="file.gif">

bunu döndürür:

<I want to find this>
<I want to find that>
<I want to find this other>
<I want to find this anotherthing>

0

Çift tırnakların lot çevresinde kullanıldığını fark ettim, bu yüzden cmd.exe'de yapıldığını tahmin ediyorum (birçok linux kullanıcısı grep kullanıyor olsa da, windows sürümü var. Windows uygulaması, çift tırnak kullanımınız sayesinde, ben de grep'in Windows uygulamasını kullanıyorum - Gnuwin32 one. (örneğin cygwin'in yerine).

Her şeyden önce, grep ile birlikte kullandığınız satırdaki hatayı düzeltmek istiyorum (regex'inizde bir hata demeyeceğim, çünkü bu bir cmd sorunu.

İşe yaramaz grep ile regex ile örnek oldu.

curl http://example.com/?q=blah | grep -o -P "(?<=alt=\")[^\"]*\"" | what's next?

Dediğin gibi, [^\"] çalışmıyor

Bakalım tam olarak grd'ye cmd ile geçmenin ne olduğunu görelim (grep'in ayrıştırması)

Bu bir C programı gerektirecek, C programı çalışmayan bir teklif hakkında bu soruya dahil edildi Bu basit düzenli ifadenin grep ile eşleşmesi

C programının kodunu buraya yapıştıracağım.

Bu programı, herhangi bir programın veya herhangi bir programın ne aldığını görmek için kullanabilirsiniz. (Burada bazı teknikler konusunda yanılmış olabilirim ve eğer öyleyse bir düzeltme bekliyorum). Dedi, bu işe yarıyor.

İşte neler olup bittiğini belirlemek için kullanacağımız program

#include <stdio.h>

int main(int argc, char *argv[]) {
    int i = 0;
    while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
    }
    return 0;
}

Derledim. w.c

İşte olanlara basit bir örnek.

İşte işe yarayan bir örnek

W:\>w "[^\"]"
argv[0] = w
argv[1] = [^"]

W:\>

Yukarıda gördüğünüz gibi, programımız (w) 2 parametre alır, ilki programın adı (w), ikincisi [^"]

Şimdi, sizinkiyle aynı olan daha küçük bir örnek. [^\"] çalışmıyor

W:\>w "\"[^\"]"
argv[0] = w
argv[1] = "["]

W:\>

Grep'in ne yaptığını görün. Nedenini bilmiyorum .. Ama sanırım \ "[^ \"] 'den önce olduğunda ve her şeyin etrafında çift tırnak var, sonra [^ \ "] işe yaramıyor, tam sonucu görüyoruz , [^ \ "], ["] olarak çıkıyor. Biz, karnımızı kaybediyoruz ^

Bu, programda görebileceğimiz gibi, karnemizi koruyacaktır.

W:\>w "\"[^^\"]"
argv[0] = w
argv[1] = "[^"]

W:\>

Bu pencere sayısının yanı sıra, regex'inizde muhtemelen bir alıntı için bakmak isteyeceğiniz bir sorun var, bu nedenle bitiş alıntıyla eşleşmiyorsunuz. Başlangıç ​​teklifiyle eşleşmeyecek şekilde göz kamaştırmasını haklı olarak dahil ettin.

Örnek olarak

W:\>echo blah alt="test" | grep -o -P "(?<=alt=\")[^^\"]*(?=\")"
test

Farz edelim ki bu dosya a.a adındaydı.

dsfsdf dfdsf  alt="here" dddd

rrtrtdfddalt="there"dfdfd
alt="df"
tree="dop"

Şimdi uyguluyoruz

W:\>grep -oP "(?<=alt=\")[^^\"]*(?=\")" a.a
here
there
df

W:\>

Yani, regex çalışır ve grep.

W:\>grep -oP "(?<=alt=\")[^^\"]*(?=\")" a.a
here
there
df

W:\>

Şimdi bunu bir dosyaya verebileceğimi varsayalım. a.b yani a.b şimdi bu 3 satırı içeriyor. (her zaman a.b'ye kopyalayıp yapıştırabilirsiniz)

Şimdi a.b

here
there
df

haydi biraz önce ve sonra eklemek için sed kullanalım

W:\>sed -r "s#(.*)#http://blah.com/\1.htm#" a.b
http://blah.com/here.htm
http://blah.com/there.htm
http://blah.com/df.htm
W:\>

Ve hepsini wget ile indirebiliriz.

W:\>sed -r "s#(.*)#http://blah.com/\1.htm#" a.b >a.c

W:\>type a.c
http://blah.com/here.htm
http://blah.com/there.htm
http://blah.com/df.htm

W:\>wget -i a.c
--2012-07-26 23:21:06--  http://blah.com/here.htm
Resolving blah.com... ^C
W:\>

0

Çıkış yapmak wget -r -A.pdf [url] basit kalıplar için. Bu, tüm pdf dosyalarını bir URL'den tekrarlı olarak indirir. Bu belgedeki parça faydalıdır.

Acc -Aktör - aktçıyı kabul et ’R -R retlist - reddetme reddetme’       Kabul etmek veya reddetmek için virgülle ayrılmış dosya adı soneklerinin veya kalıplarının listelerini belirtin (bkz. Dosya Tipleri). Unutmayın:   joker karakter, ‘*’, ‘?’, ‘[’ veya ‘]’ öğesi görünür.   acclist veya retlist, bir model yerine, bir model olarak ele alınacaktır.   soneki.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.