XPath 选择图像链接 - 仅当 img src 的父 href 链接存在时,否则选择 img src 链接

Posted

技术标签:

【中文标题】XPath 选择图像链接 - 仅当 img src 的父 href 链接存在时,否则选择 img src 链接【英文标题】:XPath select image links - parent href link of img src only if it exists, else select img src link 【发布时间】:2016-10-26 13:58:56 【问题描述】:

我遇到了一个有点复杂的 XPath 问题。考虑这个网页部分的 html(我使用了 Imgur 并替换了一些文本):

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

我首先要搜索文档中的所有img标签,并找到它们对应的srces。接下来,我想检查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。

【问题讨论】:

到目前为止你有没有尝试过? 我只到了我检查链接的图像扩展的部分,但对如何选择要抓取的链接感到困惑。 您想尝试完全使用 XPath 来实现结果,还是您使用的脚本语言可以实现一些逻辑? 哪个可以产生更清洁和更有效的解决方案。我正在使用 python。 我已将其添加到您的标签中。我不懂python,祝你好运! 【参考方案1】:

这在单个 xpath 表达式中非常简单:

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

【讨论】:

哇,我从没想过优先考虑 img src(而不是),因为从逻辑上讲,我们首先优先考虑 href。看起来是一个很有前途的解决方案,但我必须先对其进行测试。 @dtgee 没有优先级,只有过滤器。【参考方案2】:

您不必在单个 XPath 表达式中执行此操作。这是一个省略图像扩展检查的 Scrapy 特定实现(根据 cmets 判断,您已经弄清楚了):

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)

【讨论】:

啊,谢谢。我想我陷入了恍惚,认为我必须只使用 XPath 来选择所有内容。我将从这个错误中吸取教训! @dtgee 您可能确实想在 xpath 中执行此操作,以便在 C 而不是 Python 中完成繁重的工作。 是的。使用 Python 使代码更具可读性,但我想使用 XPath 并添加一些 cmets 可以达到相同的目的。

以上是关于XPath 选择图像链接 - 仅当 img src 的父 href 链接存在时,否则选择 img src 链接的主要内容,如果未能解决你的问题,请参考以下文章

从 xpath 获取包含某个单词的 img src

scrapy

最近在自学python girlphoto_urls = selector.xpath('//div/a/img/@src')这句是啥意思?大神

平滑图像淡出,改变src,用jquery淡入

从 Object as src 链接到 img 标签

[当我用cheerio抓取img src时,我得到了一个巨大的字符串,而不仅仅是链接