如何在 Nokogiri 中解析图像 href

Posted

技术标签:

【中文标题】如何在 Nokogiri 中解析图像 href【英文标题】:How to parse the image href in Nokogiri 【发布时间】:2020-03-06 02:14:50 【问题描述】:

我正在使用 Nokogiri 解析网页,并想解析出图像 URL。这是我的设置:

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::html(open('https://themeforest.net/search?sort=sales'))

如果我在 chrome 上检查页面,我可以看到以下代码块:

<div class="_2_3rp " style="padding-top:50.847457627118644%">            
  <div style=""> 
    <img class="_1xvs1" src="https://themeforest.img.customer.envatousercontent.com/files/274559780/screenshots/00-Preview.jpg?auto=compress%2Cformat&amp;fit=crop&amp;crop=top&amp;w=590&amp;h=300&amp;s=37354d884fd0f3b574238e013b4ea423"                                         
      title="Avada | Responsive Multi-Purpose Theme"                    
       style="left: 0%;">            
  </div>                                                                     
</div>

但是,当我运行时:

puts doc.search("//div[@class = '_2_3rp ']")

我得到以下信息:

  <div class="_2_3rp " style="padding-top:50.847457627118644%"><div style="height:100%" class="lazyload-placeholder"></div></div>
  <div class="_2_3rp " style="padding-top:50.847457627118644%"><div style="height:100%" class="lazyload-placeholder"></div></div>
  .....
  => nil

为什么我没有得到img 类,而是得到lazyload-placeholder?有什么办法可以克服这个问题,并避开图像占位符?

【问题讨论】:

寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。见:How to create a Minimal, Reproducible Example。当要求从您的代码和数据中删除所有非必要的信息时。我无法复制这个问题,所以我认为它在某处你没有向我们展示。而且,“以下”输出不能来自输入 HTML,因为第二个 div style 不同。 @theTinMan 我已经用确切的代码更新了我的问题。这是我可以形成可重现示例的唯一方法。 【参考方案1】:

这是我想出的用于测试您的断言的最少代码:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div class="12345">
    <div>
        <img class="67890" src="https://foo.bar">
    </div>
</div>
EOT

doc.search('//div[@class=12345]').map(&:to_html)
# => ["<div class=\"12345\">\n" +
#     "    <div>\n" +
#     "        <img class=\"67890\" src=\"https://foo.bar\">\n" +
#     "    </div>\n" +
#     "</div>"]
#     "</div>"]

看起来img标签在那里。

您正在使用Nokogiri::XML 进行解析。不要这样做,因为会发生严格的解析,而且对于 HTML,它不是严格的,如果 HTML 格式不正确,可能会出现问题。

【讨论】:

Nokogiri::HTML解析返回相同的结果

以上是关于如何在 Nokogiri 中解析图像 href的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Nokogiri 在 TMX 中搜索道具元素

如何使用Nokogiri解析带有非对标签的XML

如何通过 Nokogiri 在页面上获取特定的可查看字符串

创建“Nokogiri::XML”或“Nokogiri::HTML”对象时如何避免创建无意义的空白文本节点

从href html标签中提取带有红宝石中nokogiri的链接(URL)?

使用Savon和Nokogiri在Rails中解析XML SOAP响应的内存不足