Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- notroot@ubuntu:~$ irb
- irb(main):001:0> $KCODE = 'u'
- => "u"
- irb(main):002:0> require 'rubygems'
- => true
- irb(main):003:0> require 'nokogiri'
- => true
- irb(main):004:0> doc = Nokogiri::HTML.parse(open('test.html'), nil, 'utf-8'); 'quiet'
- => "quiet"
- irb(main):005:0> table = doc.xpath('//ul[@id="ul_list"]/li/a')
- => [#<Nokogiri::XML::Element:0x..fdbb2fa9c name="a" attributes=[#<Nokogiri::XML::Attr:0x..fdbb2f920 name="href" value="tv_play-hdteleplay_20100211_7168444.html">, #<Nokogiri::XML::Attr:0x..fdbb2f916 name="title" value="斯巴达克斯:血与沙第1集">]>, #<Nokogiri::XML::Element:0x..fdbb2fa2e name="a" attributes=[#<Nokogiri::XML::Attr:0x..fdbb2efb6 name="href" value="tv_play-hdteleplay_20100211_7168445.html">, #<Nokogiri::XML::Attr:0x..fdbb2efac name="title" value="斯巴达克斯:血与沙第2集">]>]
- # doc 和 table 分别是 Document 和 NodeSet 类的对象
- irb(main):006:0> doc.class
- => Nokogiri::HTML::Document
- irb(main):007:0> table.class
- => Nokogiri::XML::NodeSet
- # table 这个 NodeSet(节点集合) 长度为 2
- irb(main):008:0> table.length
- => 2
- # 输出一下, table 的 2 个节点是我们之前用 XPath 选出来的两个 HTML a 元素
- irb(main):009:0> puts table
- <a href="tv_play-hdteleplay_20100211_7168444.html" title="斯巴达克斯:血与沙第1集"></a>
- <a href="tv_play-hdteleplay_20100211_7168445.html" title="斯巴达克斯:血与沙第2集"></a>
- => nil
- # 虽然 table 里只有两个 a 元素, 但是这两个 a 元素仍然是在解析 test.html 之后生成的树结构上吊着的,
- # 在这两个 a 元素上求值形如 '//li' 这样的 XPath 表达式仍然会选择那颗树上的任意位置的 li 元素.
- # 这就是 '//' 在 XPath 表达式中的语义.
- # 所以下面的语句的确删除了 doc 这棵树上的 class 为 expli 的 li 元素.
- irb(main):010:0> table.xpath('//li[@class="expli"]').remove
- => [#<Nokogiri::XML::Element:0x..fdbb173d4 name="li" attributes=[#<Nokogiri::XML::Attr:0x..fdbb16ed4 name="class" value="expli">] children=[#<Nokogiri::XML::Element:0x..fdbb2fa9c name="a" attributes=[#<Nokogiri::XML::Attr:0x..fdbb2f920 name="href" value="tv_play-hdteleplay_20100211_7168444.html">, #<Nokogiri::XML::Attr:0x..fdbb2f916 name="title" value="斯巴达克斯:血与沙第1集">]>, #<Nokogiri::XML::Text:0x..fdbb14f9e "\n ">]>]
- # 但是从那颗树上删除那个 li 元素并没有从 table 这个 NodeSet 里移除那个 li 元素.
- # 我们的 table 长度仍然为 2.
- irb(main):011:0> table.length
- => 2
- # 内容也还是原来的内容.
- irb(main):012:0> puts table
- <a href="tv_play-hdteleplay_20100211_7168444.html" title="斯巴达克斯:血与沙第1集"></a>
- <a href="tv_play-hdteleplay_20100211_7168445.html" title="斯巴达克斯:血与沙第2集"></a>
- => nil
- # 但是那个 li 节点的确从解析 test.html 生成的树结构 doc 上被移除了.
- irb(main):013:0> doc.xpath('//li[@class="expli"]')
- => []
- # 如果想得到删除那个 li 元素之后剩下的所有 li 元素的 NodeSet, 那再在 doc
- # 上求值 XPath 表达式 '/html/body/ul/li' 就好.
- irb(main):014:0> puts doc.xpath('/html/body/ul/li')
- <li>
- <a href="tv_play-hdteleplay_20100211_7168445.html" title="斯巴达克斯:血与沙第2集"></a>
- </li>
- => nil
- # 在 table 上求值 XPath 表达式 '//ul/li' 也是一样的.
- irb(main):015:0> puts table.xpath('//ul/li')
- <li>
- <a href="tv_play-hdteleplay_20100211_7168445.html" title="斯巴达克斯:血与沙第2集"></a>
- </li>
- => nil
Add Comment
Please, Sign In to add comment