ruby - 如何搜索单个节点,而不是所有节点

标签 ruby xpath nokogiri

我使用 XPath 选择器选择页面上的每个项目(大约 24 个),然后我对每个项目使用 XPath 选择器以返回每个项目的值。

即使我在子节点上运行 XPath 选择器,它似乎也在所有子节点中搜索,我只希望在每个子节点上单独完成。

下面是搜索 doc 上的每个项目然后迭代每个 html_listing 的代码。然后它将它传递给 get_field_data_from:

def get_listing(doc,field_data = {})
  doc.xpath(get_listing_tag[:path]).each do |html_listing|
    fd = get_field_data_from(html_listing,field_data)
    if !field_data &&  fd.detect {|_,data| !data }
      set_uri doc.xpath(get_sub_page_tag[:path])
      get
      fd = get_listing(Nokogiri::HTML(body),fd)
    end
    yield fd
  end
end

因此它遍历我正在寻找的所有 Fields 用于检索包含字符串的 XPath 选择器

selector = send("get_%s_tag" % field)

如果选择器存在但尚未找到数据,它将在 HTML item 上使用 XPath 选择器,使用 存储文本

res[field] = item.xpath(selector[:path]).inner_text

然后返回将在下一次迭代中使用的结果哈希。

def get_field_data_from(item,data)
  Fields.inject(data) do |res,field|
    selector = send("get_%s_tag" % field)
    unless !selector || res[field]
      begin
        res[field] = item.xpath(selector[:path]).inner_text
      rescue Exception => e
        puts "Error for field: %s" % field
        raise e
      end
    end
    res
  end
end

不知何故似乎在做

res[field] = item.xpath(selector[:path]).inner_text

它似乎搜索了所有项目,而不是仅搜索给定的项目列表。我知道它这样做是因为:

  1. 做:

    puts item.xpath(selector[:path]).inner_text
    

    返回多个结果

  2. 我实际上并没有遍历所有 html_listings。它在 get_listing 中生成字段数据 yield fd 的地方我做了一个 break 所以它只执行一次。

我似乎无法弄清楚发生了什么。别人看到了吗?

最佳答案

您需要将 XPath 查询锚定在元素上:

  • node.xpath("//example") 进行全局搜索
  • node.xpath(".//example") 从当前节点开始进行本地搜索

注意前导点 .,它将查询锚定在当前节点。否则查询将针对根节点运行,即使您从当前节点调用它也是如此。

如果您按标签名称搜索,请考虑改用 CSS 选择器。与 XPath 相比,它们的陷阱更少。 CSS 总是从当前节点开始搜索。

关于ruby - 如何搜索单个节点,而不是所有节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41402029/

相关文章:

ruby - 使用 Ruby 将 base64 而不是 url 传递到 Microsoft Azure 计算机视觉 API 的正确语法是什么

ruby - 在 Ruby 中验证 DateTime 对象

c# - Xpath错误:表达式必须计算为节点集

ruby - 遍历每个 xml 节点

ruby-on-rails - OS X Mavericks,无法安装 libxml-ruby gem?

ruby-on-rails - 使用 Nokogiri 通过 CDATA 属性在 XML 文件中查找元素?

ruby-on-rails - 路由到 slug 时出现 Rails 路由错误

ruby - 如何修补 RequestId 中间件或为什么 Heroku 不使用标准的 HTTP_X_REQUEST_ID?

xml - Xpath:简单条件检查并在 Xpath 表达式中赋值

java - 如何找到埋在数组中的特定元素的 xpath,其中唯一 ID 是动态的?