我使用 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
它似乎搜索了所有项目,而不是仅搜索给定的项目列表。我知道它这样做是因为:
做:
puts item.xpath(selector[:path]).inner_text
返回多个结果
我实际上并没有遍历所有 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/