2016-06-24 4 views
5

多少複雑なXPathの問題が発生しました。 (私はImgurを使用していくつかのテキストを置き換え)は、ウェブページの一部のこのHTMLを考えてみましょう:XPathの選択イメージリンク - img srcの親hrefのリンクのみが存在する場合はimg src link

<a href="//i.imgur.com/ahreflink.jpg" class="zoom"> 
    <img class="post-image-placeholder" src="//i.imgur.com/imgsrclink.jpg"> 
    </img> 
</a> 

私は最初のドキュメント内のすべてのimgのタグを検索すると、それらに対応するsrc ESを見つけます。次に、img srcのリンクに画像ファイル拡張子(.jpeg、.jpg、.gif、.png)が含まれているかどうかを確認します。イメージの拡張子が含まれていない場合は、それをつかんではいけません。この場合、画像拡張子を持ちます。今私たちはどのリンクをつかみたいのか把握したいと思います。 parent hrefが存在するので、対応するリンクを取得する必要があります。

望ましい結果://i.imgur.com/ahreflink.jpg

しかし、今のはparent hrefが存在しないとしましょう:

<a name="missing! oh no!"> 
    <img class="post-image-placeholder" src="//i.imgur.com/imgsrclink.jpg"> 
    </img> 
</a> 

を希望する結果://i.imgur.com/imgsrclink.jpg

どのように私はこのXPathを構築行くのですが?役立つなら、XPathでPython(Scrapy)も使用しています。したがって、問題を切り分ける必要がある場合は、Pythonも同様に使用できます。

+0

これまでに何か試しましたか? –

+0

私はリンクの画像の拡張子をチェックする部分にしか行きませんでしたが、どのリンクをつかむかを選択する方法については混乱しました。 – dtgee

+0

XPathを使用して結果を完全に達成したいのですか、または使用しているスクリプト言語を使用してロジックの一部を実装できますか? –

答えて

4

これは、単一のXPath式で行うことは非常に簡単です:

//a[not(@href)]/img/@src | //a[img]/@href 
+0

うわー、最初にimg srcに優先順位を付けることは考えていませんでした。なぜなら論理的に言えば、まずhrefを優先順位付けしているからです。私は最初にそれをテストしなければならないだろうが、有望な解決策のように見える。 – dtgee

+0

@dtgee優先度はなく、フィルタのみです。 – o11c

4

単一のXPath式で行う必要はありません。ここでは、画像の拡張子チェックを省略Scrapy具体的な実装である(コメントから判断するには、あなたはすでにそれを考え出した):

images = response.xpath("//a/img") 
for image in images: 
    a_link = image.xpath("../@href").extract_first() 
    image_link = image.xpath("@src").extract_first() 

    print(a_link or image_link) 
+0

ああ、ありがとう。私はすべてを選択するためだけにXPathを使用しなければならないと思ったので、私はトランスで立ち往生したようだ。私はこの間違いから学ぶでしょう! – dtgee

+0

@dtgee PythonではなくC言語で重い作業を続けるために、xpathでやりたいと思うかもしれません。 – o11c

+0

真。 Pythonを使用すると、コードがはるかに読みやすくなりますが、XPathを使用していくつかのコメントを追加すると、同じ目的が実現します。 – dtgee