- 浏览: 269674 次
- 性别:
- 来自: 尤溪
文章分类
最新评论
-
palytoxin:
我现在也发现是这样
关于分享 -
float2net:
Java社区,分享有利于提高。
关于分享 -
hz_qiuyuanxin:
头晕啊,啊邱
RSpec学习笔记 -
reyesyang:
...
关于分享 -
Hooopo:
一般实现map都先实现each
在 Ruby 中对树状结构(tree)进行 map 操作
Hpricot::Doc的search方法返回一个Hpricot::Elements对象(Hpricot::Elem对象的集合),方法的参数可以是XPath或者CSS选择器。
search方法也可以直接用除号代替:
果然这玩意越看越像jQuery。。
Hpricot::Doc的at方法返回匹配选择器的第一个元素,并包装为Hpricot::Elem对象。Elements和Elem对象也都有这个方法。
Hpricot::Elem对象有[]方法,参数是字符串,可以取得元素的各个属性值,例如:
Elem对象还有个attributes方法,返回Hpricot::Attributes对象,这个对象也有[]方法,上面的代码也可以改写为:
Doc对象、Elem对象和Elements对象都有inner_html和to_html方法。
Elements对象的first方法返回集合中第1个Elem对象,elements[0]的作用和first方法相同。
还可以在Elements对象中继续进行搜索,如:
甚至可以在Elem对象中搜索:
Elements有个any?方法,如果Elements#size为0,Elements#any?返回false,反之则返回true。
Elem对象有一个set_attribute方法,用来改变对象的某个属性值:
下面这段代码的效果是一样的:
还有个更简单的方法——通过Elements的set方法来为其中的所有Elem设置属性值:
但是要注意:只有Elem可以用set_attribute和[]来修改属性值,只有Elements可以用set方法修改属性值。
每个Elem对象都有一个css_path和xpath方法。
接下来是Elements对象的几个常用方法的详解:
从结果可以看出,似乎带block的at方法的返回值并不是所谓的“the original set of Elements”,这里是这个版本的bug还是文档写错了?或者是我理解错了?另外要注意的是,带block的at方法只在Elements对象中起作用,Doc对象和Elem对象只能简单的调用不带block的at方法,加block不起作用。
Elements对象的search方法带block的情况下的返回值倒是“the original set of Elements”了。
这里特别记一下,我一开始以为wrap方法不起作用,后来发现是我搞错了,我最初写的代码是这样的:
输出结果中没发现有任何变化。后来发现after方法存在同样的问题,再仔细想了想,divs变量保存的是那两个div元素,wrap上去的东西在div的外面,输出divs当然看不到外面的变化了,如果这时候输出doc变量,就可以看见变化了。
Elem对象有个swap方法,swap的作用是把该元素原来的内容用新字符串(可以是html也可以是普通字符串)替换掉:
从结果中可以看到,swap之后,直接输出divs变量看不出任何变化,输出doc变量就可以看到变化了。估计是因为一般swap的操作都是一次性的吧。。
Elements的remove方法用于从文档中删除所有Elements中包含的元素。
Elements和Elem都有一个after方法(我试了一下,其实还有一个before方法,当然,作用跟after是相对的),用于在指定元素的后面添加字符串(可以是html代码,也可以是普通字符串)。
Elem的next方法返回下一个节点,不跳过文本节点。
next_sibling返回下一个节点,跳过文本节点。
相对的有previous和previous_sibling。
CSS选择器还算熟悉,就不记了,详见:http://wiki.github.com/hpricot/hpricot/hpricot-css-search
http://wiki.github.com/hpricot/hpricot/supported-css-selectors
最后:
睡觉睡觉。
require 'open-uri' require 'hpricot' doc=Hpricot(open('http://www.tianya.cn/publicforum/content/free/1/1455739.shtml')) content = doc.search("#pageDivTop") puts content
search方法也可以直接用除号代替:
require 'open-uri' require 'hpricot' doc=Hpricot(open('http://www.tianya.cn/publicforum/content/free/1/1455739.shtml')) content = doc/"#pageDivTop" puts content
果然这玩意越看越像jQuery。。
Hpricot::Doc的at方法返回匹配选择器的第一个元素,并包装为Hpricot::Elem对象。Elements和Elem对象也都有这个方法。
Hpricot::Elem对象有[]方法,参数是字符串,可以取得元素的各个属性值,例如:
img=doc.at('img') img['src'] #第1个img元素的src值
Elem对象还有个attributes方法,返回Hpricot::Attributes对象,这个对象也有[]方法,上面的代码也可以改写为:
img=doc.at('img') img.attributes['src'] #第1个img元素的src值
Doc对象、Elem对象和Elements对象都有inner_html和to_html方法。
Elements对象的first方法返回集合中第1个Elem对象,elements[0]的作用和first方法相同。
还可以在Elements对象中继续进行搜索,如:
imgs=doc/"img" google_logo=imgs/"#googleLogo" divs=doc/"div" spans=divs/"span" #更简单的方法 spans=doc/"div span"
甚至可以在Elem对象中搜索:
divs=doc/"div" spans=divs[0]/'span'
Elements有个any?方法,如果Elements#size为0,Elements#any?返回false,反之则返回true。
Elem对象有一个set_attribute方法,用来改变对象的某个属性值:
require 'open-uri' require 'hpricot' doc=Hpricot(open('http://www.tianya.cn/publicforum/content/free/1/1455739.shtml')) divs=doc/'div' divs.each do |div| div.set_attribute :class, "newClass" puts div['class'] end
下面这段代码的效果是一样的:
require 'open-uri' require 'hpricot' doc=Hpricot(open('http://www.tianya.cn/publicforum/content/free/1/1455739.shtml')) divs=doc/'div' divs.each do |div| div['class']= "newClass" puts div['class'] end
还有个更简单的方法——通过Elements的set方法来为其中的所有Elem设置属性值:
require 'open-uri' require 'hpricot' doc=Hpricot(open('http://www.tianya.cn/publicforum/content/free/1/1455739.shtml')) divs=doc/'div' divs.set(:class=>"newClass") divs.each do |div| puts div['class'] end
但是要注意:只有Elem可以用set_attribute和[]来修改属性值,只有Elements可以用set方法修改属性值。
每个Elem对象都有一个css_path和xpath方法。
接下来是Elements对象的几个常用方法的详解:
引用
at( expression, &block )
Find a single element which matches the CSS or XPath expression. If a block is given, the matching element is passed to the block and the original set of Elements is returned.
Find a single element which matches the CSS or XPath expression. If a block is given, the matching element is passed to the block and the original set of Elements is returned.
doc=Hpricot(<<html <div id="div1"> <span id="span1">1</span> <span>2</span> </div> <div id="div2"> <span>3</span> <input type="text" id="input1" value="haliluya"/> </div> html ) t=doc.search('div').at('span') do |span| puts span.inner_text end puts t #输出: #1 #2 #3 #<div id="div1"> # <span id="span1">1</span> # <span>2</span> #</div>
从结果可以看出,似乎带block的at方法的返回值并不是所谓的“the original set of Elements”,这里是这个版本的bug还是文档写错了?或者是我理解错了?另外要注意的是,带block的at方法只在Elements对象中起作用,Doc对象和Elem对象只能简单的调用不带block的at方法,加block不起作用。
引用
search( expression, &block )
Finds all elements which match the CSS or XPath expression. If a block is given, the matching elements are passed to the block, in turn, and the original set of Elements is returned.
Finds all elements which match the CSS or XPath expression. If a block is given, the matching elements are passed to the block, in turn, and the original set of Elements is returned.
Elements对象的search方法带block的情况下的返回值倒是“the original set of Elements”了。
引用
append( html_string )
Add HTML from html_string within each element, to the end of each element’s content.
Add HTML from html_string within each element, to the end of each element’s content.
引用
prepend( html_string )
Add HTML from html_string with each element, to the beginning of each element’s content.
Add HTML from html_string with each element, to the beginning of each element’s content.
引用
wrap( html_string )
Wraps each element in the set inside the element created by html_string. If more than one element is found in the html_string, Hpricot locates the deepest spot inside the first element.
This code wraps every link on the page inside a div.link and a div.link_inner nest.
Wraps each element in the set inside the element created by html_string. If more than one element is found in the html_string, Hpricot locates the deepest spot inside the first element.
doc.search("a[@href]").wrap(%{<div class="link"><div class="link_inner"></div></div>})
This code wraps every link on the page inside a div.link and a div.link_inner nest.
这里特别记一下,我一开始以为wrap方法不起作用,后来发现是我搞错了,我最初写的代码是这样的:
doc=Hpricot(<<html <div id="div1"> <span id="span1">1</span> <span>2</span> </div> <div id="div2"> <span>3</span> <input type="text" id="input1" value="haliluya"/> </div> html ) divs=doc/'div' divs.wrap "<p></p>" #可以简单的写作divs.wrap "<p>",再试试divs.wrap "<p><h>" puts divs
输出结果中没发现有任何变化。后来发现after方法存在同样的问题,再仔细想了想,divs变量保存的是那两个div元素,wrap上去的东西在div的外面,输出divs当然看不到外面的变化了,如果这时候输出doc变量,就可以看见变化了。
Elem对象有个swap方法,swap的作用是把该元素原来的内容用新字符串(可以是html也可以是普通字符串)替换掉:
doc=Hpricot(<<html <div id="div1"> <span id="span1">1</span> <span>2</span> </div> <div id="div2"> <span>3</span> <input type="text" id="input1" value="haliluya"/> </div> html ) divs=doc/'div' divs.first.swap("<p>p</p>") puts divs puts "=======" puts doc
从结果中可以看到,swap之后,直接输出divs变量看不出任何变化,输出doc变量就可以看到变化了。估计是因为一般swap的操作都是一次性的吧。。
Elements的remove方法用于从文档中删除所有Elements中包含的元素。
# Remove all elements in this list from the document which contains them. doc = Hpricot("<html>Remove this: <b>here</b></html>") doc.search("b").remove doc.to_html # => "<html>Remove this: </html>"
Elements和Elem都有一个after方法(我试了一下,其实还有一个before方法,当然,作用跟after是相对的),用于在指定元素的后面添加字符串(可以是html代码,也可以是普通字符串)。
doc=Hpricot(<<html <div id="div1"> <span id="span1">1</span> <span>2</span> </div> <div id="div2"> <span>3</span> <input type="text" id="input1" value="haliluya"/> </div> html ) divs=doc/'div' divs.after "<a href='#'/>" puts doc
Elem的next方法返回下一个节点,不跳过文本节点。
next_sibling返回下一个节点,跳过文本节点。
相对的有previous和previous_sibling。
require 'hpricot' doc=Hpricot(<<HTML <TABLE cellspacing=0 border=0 width=100% > <TR> <TD> <font size=-1 color=green><br> <center> <div id="tianyaBrandSpan1"></div> <div id="adsp_content_banner_3" style="background-color:#F5F9FA;padding:10px 0 0 0;"></div> <div id="adsp_content_adtopic"></div> <div id="adsp_content_banner_1" style="background-color:#F5F9FA"></div> </center> </TD> </TR> </table> HTML ) puts doc.at('#tianyaBrandSpan1').next #一个包含了空行的文本节点(Hpricot::Text) puts doc.at('#tianyaBrandSpan1').next_sibling #id为adsp_content_banner_3的div节点
CSS选择器还算熟悉,就不记了,详见:http://wiki.github.com/hpricot/hpricot/hpricot-css-search
http://wiki.github.com/hpricot/hpricot/supported-css-selectors
最后:
引用
The CSS selectors are almost always easier to write and cleaner to combine. In addition, XPath support is pretty limited at present.
睡觉睡觉。
发表评论
-
在 Ruby 中对树状结构(tree)进行 map 操作
2012-07-30 21:37 2858class BookChapter < ActiveRe ... -
一小段代码理解Fiber
2012-03-24 17:55 1446server = Fiber.new do |request| ... -
靠……靠谱量又足啊
2011-05-15 15:23 2089起源:慎用类变量 - 实例变量靠谱量又足 大概如下 ... -
RSpec-Core 2.6
2011-05-14 21:55 3498主要是转载吧,文档在墙的另一边,翻过去嫌麻烦,更多详细内容: ... -
在view spec中用Capybara.string的结果替代rendered(Capybara版本0.4.12)
2011-05-10 10:12 1564问题关键字:undefined method `has_sel ... -
rails best practices
2011-05-03 00:44 0我还清楚的记得,在06年左右,我写第一个软件的时候,1个月内心 ... -
authlogic笔记
2010-04-17 21:46 6174参考: http://github.com/binarylog ... -
JRuby on Rails连接MySQL遇到的一个问题。
2010-01-22 05:07 1770按照官方的wiki安装好JRuby、Rails以及需要的ada ... -
任务来了
2009-12-27 20:53 0要求像 www.tieku.org 一样,抓取天涯的热门文章, ... -
alias,alias_method和alias_method_chain
2009-12-16 23:45 4488晚上被问到这三个的区别,没答上来,查了一下书本跟google。 ... -
webrat,草草记一下。
2009-12-14 15:55 0visit:发送一个get请求,相当于在浏览器的地址栏中输入u ... -
ffffffff
2009-11-12 21:14 0各司其职,cucumber用于描述最表层的“行为”,rspec ... -
RSpec学习笔记
2009-09-21 01:37 2226前面这部分参考自:http ... -
What's the difference between private and protected methods?
2009-08-27 23:30 1172引用 In Ruby, private visibility ... -
ubuntu下安装Ruby、Rails全记录
2009-08-10 19:27 2062还是记下来吧,之前花了很大力气安装成功过,前几天重装系统,Ru ... -
RSpec学习笔记
2009-03-30 17:46 0before(:all) 在所有example之前执行,并只执 ...
相关推荐
笔记笔记笔记笔记笔记笔记笔记笔记笔记算法笔记算法笔记算法笔记算法笔记算法笔记
ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记...
git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git...
MFC笔记 MFC笔记 MFC笔记 MFC笔记 MFC笔记 MFC笔记
狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神...
小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+...
c语言笔记c语言笔记c语言笔记c语言笔记
工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记
2020谷粒商城笔记资料,谷粒商城2020文档课件笔记+源代码(基础篇+高级篇) 谷粒商城2020文档课件笔记+源代码(基础篇+高级篇) 2020谷粒商城笔记资料(基础篇+高级篇) 尚硅谷谷粒商城笔记,很全。基础篇,高级篇...
j2ee 笔记 j2ee 笔记 j2ee 笔记 j2ee 笔记
Java相关课程系列笔记之一Java学习笔记 Java相关课程系列笔记之四JDBC学习笔记 Java相关课程系列笔记之六HTML学习笔记 Java相关课程系列笔记之七CSS学习笔记 Java相关课程系列笔记之八JavaScript学习笔记 Java相关...
java笔记java笔记java笔记java笔记java笔记java笔记java笔记
b站狂神说课程笔记大全,每个部分都有 狂神说java系列笔记(java基础+javaweb+ssm+微服务)全套 狂神说上课笔记未删减 Java基础到技术升级 1、JavaSE:Java入门 2、JavaSE:基础语法 3、JavaSE:流程控制 4、JavaSE...
oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记...
python笔记python笔记python笔记python笔记python笔记python笔记python笔记python笔记python笔记
JDBC笔记 JDBC笔记 JDBC笔记
为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序...
杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代...
有道笔记本桌面版是网易有道出品的电子笔记本软件。 特色功能: 1.自动增量同步 2.按照笔记本来整理笔记 3.富文本编辑笔记,可...5.邮件功能发送笔记,快速分享笔记内容。 6.密码保护锁定窗口,保护用户隐私安全。
JQuery笔记JQuery笔记JQuery笔记JQuery笔记JQuery笔记JQuery笔记JQuery笔记JQuery笔记JQuery笔记JQuery笔记JQuery笔记JQuery笔记JQuery笔记JQuery笔记JQuery笔记