gpt4 book ai didi

ruby - hpricot 与 Firebug 的 XPath

转载 作者:数据小太阳 更新时间:2023-10-29 08:25:42 26 4
gpt4 key购买 nike

我正在尝试使用 hpricot 从基于表格的网站中提取一些信息。我用 FireBug 获得了 XPath。

/html/body/div/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/td[2]/table/tbody/tr[3]/td/table[3]/tbody/tr

这不起作用...显然,FireBug 的 XPath 是呈现的 HTML 的路径,而不是来自站点的实际 HTML。我读到删除 tbody 可能会解决问题。

我尝试:

/html/body/div/table/tr/td/table/tr[2]/td/table/tr/td[2]/table/tr[3]/td/table[3]/tr

仍然没有用...我做了更多的研究,有些人报告说他们的 XPath 删除了数字,所以我试试这个:

/html/body/div/table/tr/td/table/tr/td/table/tr/td/table/tr/td/table/tr

仍然没有运气......

所以我决定像这样一步步来:

(doc/"html/body/div/table/tr").each do |aaa |
(aaa/"td").each do | bbb|
pp bbb
(bbb/"table/tr").each do | ccc|
pp ccc
end
end
end

我在 bbb 中找到我需要的信息,但在 ccc 中找不到。

我做错了什么,或者是否有更好的工具来使用长/复杂的 XPath 废弃 HTML。

最佳答案

您的问题出在 XPather(或 Firebug XPath)中。我认为 Firefox 正在内部修复格式错误的表格以具有 tbody 元素,即使在 HTML 中没有。 Nokogiri 没有这样做,而是允许 tr 标签位于表内。

所以很有可能你的路径看起来像这样的 nokogiri:

/html/body/div/table/tr/td/table/tr[2]/td/table/tr/td[2]/table/tr[3]/td/table[3]/tr

这就是 nokogiri 接受它的方式:)

你可能想看看这个

require 'open-uri'
require 'nokogiri'

class String
def relative_to(base)
(base == self[0..base.length-1]) &&
self[base.length..-1]
end
end

module Importer
module XUtils
module_function

def match(text, source)
case text
when String
source.include? text
when Regexp
text.match(source)
when Array
text.all? {|tt| source.include?(tt)}
else
false
end
end

def find_xpath (doc, start, texts)
xpath = start
found = true

while(found)
found = [:inner_html, :inner_text].any? do |m|
doc.xpath(xpath+"/*").any? do |tag|
tag_text = tag.send(m).strip.gsub(/[\302\240]+/, ' ')
if tag_text && texts.all?{|text| match(text, tag_text)}
xpath = tag.path.to_s
end
end
end
end

(xpath != start) && xpath
end

def fetch(url)
Nokogiri::HTML(open(url).read)
end
end
end

我编写这个小模块是为了帮助我在网络抓取和数据挖掘时使用 Nokogiri。

基本用法:

 include XUtils
doc = fetch("http://some.url.here") # http:// is impotrtant!

base = find_xpath(doc, '/html/body', ["what to find1", "What to find 2"]) # when you provide array, then it'll find element conaining ALL words

precise = find_xpath(doc, base, "what to find1")
precise.relative_to base

祝你好运

关于ruby - hpricot 与 Firebug 的 XPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/734178/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com