Bash kullanarak, belirli bir resmin URL'sini ve başlık metnini html dosyasından nasıl çıkarabilirsiniz?


1

Sayısal olarak sipariş edilen birkaç yüzlerce html dosyası göz önüne alındığında, her biri birden fazla resim etiketine sahip, ancak yalnızca aradığım kimliği olan bir resim var.

<img title="$titleText" src="$imgURL" id="foo" border="0" />

nerede $imgURL ve $titleText Her sayfaya özgüdür ve sayfanın URL’si (tahmin edilebilir) olduğu için tahmin edilemez ve her sayfada istediğim resim id="foo" (her sayfada aynı, farklı veya kimliği olmayan diğer görüntüler).

Nasıl ayıklanırım $imgURL ve $titleText dizeleri bash?

Şimdiye kadar bir başlangıç ​​noktasına bakıyorum

for count in `seq 1 400`; 
   do page="https://website/$count.html"; 
   imgURL=[somehow get $imgURL from $page];
   titleText=[somehow get $titleText from $page];
   echo -e "$count\n$titleText\n$imgURL\n\n" >> some-file; 
done

ancak parçaların parantez içinde nasıl gerçekleştirileceği hakkında hiçbir fikrim yok.
Muhtemelen en az ikisini içermesi gerekecek sed / grep / curl / wget.

Düzenleme: 95% JoW tarafından cevaplandı, son çift detayı takip ediyor

JoW beni doğru yöne çevirdikten sonra gerisini kolayca çözebildim. Yukarıdaki "başlangıç ​​noktası" bash koduyla aynı amaçlanan etkiye sahip olan son komut dosyası şuydu:

#!/usr/bin/python
#
from bs4 import BeautifulSoup
import requests
for count in xrange(1, 400):
    ct = str(count)
    url = "website/" + ct + ".html"
    data = requests.get("https://" +url)
    soup = BeautifulSoup(data.text)
    for link in soup.findAll("img", {"id": "foo"}):
        with open('some-file', "a") as out:
            out.write(ct + "\n" + link['title'] + "\n" + link['src'] + "\n\n")

SuperUser'a Hoşgeldiniz poliizopren . Adresini oluşturduktan sonra page indirmek zorundasınız (belki wget ile). StdOut ve filter'a yönlendirebilirsiniz (olabildiğince diske yazmamak için). Bu sayfada bulacağınız şeyi temiz bulmuyorum. Bireyselleştirmek zorundasın benzersiz Dosyanın sadece ilginç kısmını seçmenize izin verecek etiketler (eğer sayfada çok sayıda resim varsa, birçok etiketi <img .... />, ya da bu benzersiz çünkü hepsi tek bir etikette değil <img a>... </a>? Lütfen Düzenle gönderinizi daha iyi belirtmek için, cevap vermeye yardımcı olacaktır.
Hastur

Üzgünüm, tekrar okuduğumda biraz belirsiz olduğunu görebiliyorum - benzersiz çünkü id="foo" içinde <img ... /> etiket - diğer resimlerin kimlikleri farklı veya yok.
polyisoprene

Genellikle Bir html dosyasını bir regex ile ayrıştırmak iyi bir fikir değil , ancak buna uyum sağlamayı deneyebilirsiniz, örneğin, Cevap İhtiyaçlarınıza göre sed. Her zaman oldugu gibi man sed , man wget ... kullanımı | çıktıyı başka bir komutla borulamak için ...
Hastur

1
Yeterince adil, bu yüzden kaldırmak için html ayrıştırma nasıl bir rakam <img ... /> ile etiketlemek id="foo" içinde? O kadar ileri gidersem, nasıl kullanılacağını çözmeliyim sed veya grep izole etmek $imgURL ve $titleText, ama denediğimde xmllint --html --xpath '//*[@id="foo"]' https://website/1.html Bir sürü hata aldım (ör. HTML parser error : htmlParseEntityRef: expecting ';' ) etiketine ek olarak aradım ve onlardan nasıl kurtulacağımı bulamadım (kullanarak --nowarning fark yaratmaz) - bunun ya da istenen sonucun netleştirilmesi için alternatif bir yaklaşımın nasıl düzeltileceği hakkında bir fikrin var mı?
polyisoprene

Test edilecek bir html örnek dosyası olmadan, denemek istediğinizi yapmak zordur ... Genel olarak: Bir html sayfası indirin, Sonra bunu yerel olarak test edin. Döngü ile genelleştirildikten sonra ve indirilen dosyayı yazmadan.
Hastur

Yanıtlar:


0

Son zamanlarda benzer bir problemle çalışmak zorunda kaldım ve sayısız saatlerce süren sıkıntıdan sonra, baştan itibaren kullanmam gereken BeautifulSoup4 ile python kullandım - ve bence siz de öyle yapmalısınız. Aslında bu tür bir alıştırma için oluşturulduğundan (yani HTML ayrıştırma) çalışmak daha kolaydır. BS4 kullanarak kolayca bir python betiği yazabilir, tüm resim URL'lerinizi bir dosyada toplayabilir ve ardından bu betiği bash adresinden çağırabilirsiniz.

Ben de öyle yapardım.

Düzenle:

İşte bunun nasıl görünebileceğinin kısa bir örneği:

#!/bin/python

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("index.html")) 

for link in soup.findAll("img", {"id": "foo"})
  print(link['src'])

Açıkçası bu sadece bir dosyayı (index.html) kontrol eder ve bağlantıyı durmak için yazdırır. Amacınız için her şeyi python'a yazabilirsiniz (örn., Dosyalar arasında döngü) veya dosya adlarını bash'dan python betiğinize aktarabilirsiniz. Her durumda, muhtemelen bir çıktı dosyasına URL yazmak isteyeceksiniz.

with open('output.txt', 'a') as out:
 out.write(link['src'])

Daha önce hiç Python kullanmadım, bu yüzden bunu düşünmezdim (ve o zaman bile tam olarak ne yapmamı istediğimi yapması biraz zaman aldı), ama sen bana% 95 verdin ve kurgu yaptım Sorumu doldurduğum boşlukları dahil etmek için. Teşekkürler!
polyisoprene
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.