2010-12-01 6 views
5

へのすべてのリンクを見つけて、私がイメージへのすべてのリンクを抽出したいです。私は今それを行う方法がある:「あなたはすべての可能な画像のすべてのケースで拡張子(「JPG」の両方をリストする必要がありパイソン、XPathは:私はいくつかのHTMLを解析するPythonでlxmlのを使用している画像

  • と:

    //a[contains(@href,'.jpg') or contains(@href,'.jpeg') or ... (etc)] 
    

    あり、このアプローチの問題のカップルですJPG」)は、ウィッヒは奇妙な状況で

  • エレガントではない、hrefがない私は正規表現を使用していた

文字列の最後に、どこか途中での.jpgを含むことができ、私は失敗しました:

//a[regx:match(@href,'.*\.(?:png|jpg|jpeg)')] 

これは、すべてのリンクのすべての時間を私に戻っ...

は、誰もがこれを行うには正しい、エレガントな方法を知っているか、私の正規表現のアプローチと間違っている何をしていますか?

+0

良い質問、+1。あなたの問題の一つの解決のために私の答えを参照してください - だけ与えられた文字列で終わること@href見つけます。 –

+0

部分文字列を記述するその他の回答に加えて、translate関数を使用して大文字と小文字の変換を行うことができます。 translate(@href、 "EGIJFNP"、 "egijfnp")(png、jpeg、gif内のすべての文字) – yonran

+0

@yonran拡張子だけでなく、URLの残りの部分も変更するので、これはいい考えか分かりません。 –

答えて

2

代わりの

a[contains(@href,'.jpg')] 

使用

a[substring(@href, string-length(@href)-3)='.jpg'] 

(および他の可能なエンディング用の同じ発現パターン)。

上記の式は次のXPath 2.0の式と同等のXPath 1.0:

a[ends-with(@href, '.jpg')] 
2

使用XPathはすべて<a>の要素を返し、あなたの正規表現にマッチするものに絞り込むために、Pythonのリスト内包を使用します。

+1

自分自身でこれに行きたいと思います。しかし、XPathが正規表現を行うことができない理由を答えることはできません。 – delnan

+0

多分あなたの構文です。速いgoogleは、 'regx:match'の代わりに' fn:matches'を提案します。 –

1

あなたの選択肢を制限したリンクは、すべてのファイル拡張子を持っている、またはファイル拡張子でも(例えば、エラーHTMLを返すURLをの.jpg)コンテンツが一致するという保証はありませんので。

サイトからすべての画像を収集する唯一の正しい方法は、のすべてのリンクを取得し、HTTP HEAD要求で照会して、サーバーが送信しているContent-Typeを調べることです。コンテンツタイプは、画像/(何)である場合には、それ以外の場合はありません、イメージです。一般的なファイル拡張子のURLを削れ

はおそらくかかわらず、あなたの画像の99.9%を取得する予定です。それはエレガントではないが、どちらもほとんどのHTMLです。この場合、99.9%で喜んで解決することをお勧めします。余分な0.1%はそれに値するものではありません。

0

用途:

//a[@href[contains('|png|jpg|jpeg|', 
        concat('|', 
          substring-after(substring(.,string-legth()-4),'.'), 
          '|')]] 
2

lxmlがEXSLT名前空間の正規表現をサポートしています。

from lxml import html 

# download & parse web page 
doc = html.parse('http://apod.nasa.gov/apod/astropix.html') 

# find the first <a href that ends with .png or .jpg or .jpeg ignoring case 
ns = {'re': "http://exslt.org/regular-expressions"} 
img_url = doc.xpath(r"//a[re:test(@href, '\.(?:png|jpg|jpeg)', 'i')]/@href", 
        namespaces=ns, smart_strings=False)[0] 
print(img_url) 
関連する問題