- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试使用 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/
已升级到 Rails 3,并在混合平台开发组中使用 Bundler for gems。我在 Windows 上。当我运行 Bundle Install 时,它会成功完成,但不会安装 hpricot。
我正在按照以下说明尝试将我的博客迁移到 Jekyll:http://jekyllrb.com/docs/migrations/ 我的所有帖子都是 .xml 格式的,但是转换它们的命令似乎不起作用:
我正在使用 hpricot 来阅读 HTML。我遇到了段错误,我用谷歌搜索,有人说升级到最新版本的 Ruby。我正在使用 rails 2.3.2 和 ruby 1.8.7。如何解决这个错误? 最佳
在 ruby 1.9 中尝试使用 hpricot 抓取网页时出现以下编码错误: Encoding::CompatibilityError: incompatible character encod
我正在使用 Ruby 的 Hpricot gem 来解析 html。我想从文档中删除单个节点以便在其他地方使用,但我找不到办法。 我看到我可以删除整个元素列表,使用 Hpricot::Elements
我正在尝试编写一个 CSS 选择器,它可以使用 hpricot 选择除脚本元素之外的所有内容,我可以轻松地选择 select-me div 的所有内容,然后删除脚本元素,但我想知道它是否可以使用一个将
我刚开始学习 Ruby。很酷的语言,很喜欢。 我正在使用非常方便的 Hpricot HTML 解析器。 我要做的是抓取页面中的所有文本,不包括 HTML 标记。 例子:
我想从 HTML 页面(实际上是 tinymce 用户输入)中删除所有不符合特定条件(class = "int"或 class = "ext")的图像,我正在努力寻找正确的方法。这就是我目前所做的:
Hpricot + Ruby XML 解析和逻辑选择。 目标:找到作者 Bob 写的所有标题。 我的 XML 文件: Book1 march 1 2010 Bob book2 october
现在http://github.com/why/hpricot/wikis/home不再存在。 最佳答案 尝试 github.com/whymirror您将获得 _why 创建的所有内容 或者特别是
你会选择哪一个?我的重要属性是(排名不分先后): 支持和 future 的改进。 社区和一般知识库(在 Internet 上)。 全面(即,证明可以解析范围广泛的 *.*ml 页面)。 表现。 内存占
我刚刚注意到很多 hpricot 代码都是用 java 编写的... alt text http://img697.imageshack.us/img697/7447/picture2yw.png 我
我已经做了一些搜索,但没有一个能解决这个奇怪的、意想不到的问题。直接看代码吹吧: require 'open-uri' require 'hpricot' doc = Hpricot(open("ht
有人可以解释一下如何使用带有 Hpricot gem 的 Ruby 将自定义属性添加到 HTML 标签吗? 我有一个看起来像这样的标签: 我想添加一个名为“Readable=0”的自定义整数属性,它
我正在编写一个 ruby 脚本来从 Yahoo 获取历史股票价格,使用 Hpricot 来解析页面。这主要是直截了当的:网址是“http://finance.yahoo.com/q/hp?s= T
我正在编写一些代码,为页面上的两个 css 类抓取页面。我只是为此使用 Hpricot 搜索方法: webpage.search("body").search("div.first_class | d
在 Hpricot 文档中(位于 https://github.com/hpricot/hpricot),有一个 doc.search() 方法。然后文档继续说“快捷方式是使用除数”: (doc/"p
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我知道我可以使用 Hpricot 解析 XML,但是否也可以创建文件?我找到的所有教程都只演示解析。 最佳答案 Jim Weirich 的 Builder非常容易使用。这是来自 Enterprise
像这样: Hello world just do it 我想删除每个元素的“样式”属性。我想要这样的结果: Hello world just do it 如何使用 hpricot 做到这一
我是一名优秀的程序员,十分优秀!