2016-06-24 113 views
5

我遇到了一个有点复杂的XPath问题。考虑的网页(我使用Imgur和更换一些文字)的一部分,此HTML:XPath选择图像链接 - 仅当img src的父级href链接存在时,否则选择img src链接

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

我首先要搜索的文件中,并找到其对应的src ES所有img标签。接下来,我要检查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?如果它有帮助,我也使用Python(Scrapy)和XPath。所以如果问题需要分离出来,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你可能*做*想在xpath中完成它,以保持C而不是Python的繁重工作。 – o11c

+0

是。使用Python使得代码更具可读性,但我想使用XPath并添加一些注释可以达到同样的目的。 – dtgee