Guest User

Untitled

a guest
May 22nd, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.37 KB | None | 0 0
  1. notroot@ubuntu:~$ irb
  2. irb(main):001:0> $KCODE = 'u'
  3. => "u"
  4. irb(main):002:0> require 'rubygems'
  5. => true
  6. irb(main):003:0> require 'nokogiri'
  7. => true
  8. irb(main):004:0> doc = Nokogiri::HTML.parse(open('test.html'), nil, 'utf-8'); 'quiet'
  9. => "quiet"
  10. irb(main):005:0> table = doc.xpath('//ul[@id="ul_list"]/li/a')
  11. => [#<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集">]>]
  12.  
  13. # doc 和 table 分别是 Document 和 NodeSet 类的对象
  14. irb(main):006:0> doc.class
  15. => Nokogiri::HTML::Document
  16. irb(main):007:0> table.class
  17. => Nokogiri::XML::NodeSet
  18.  
  19. # table 这个 NodeSet(节点集合) 长度为 2
  20. irb(main):008:0> table.length
  21. => 2
  22.  
  23. # 输出一下, table 的 2 个节点是我们之前用 XPath 选出来的两个 HTML a 元素
  24. irb(main):009:0> puts table
  25. <a href="tv_play-hdteleplay_20100211_7168444.html" title="斯巴达克斯:血与沙第1集"></a>
  26. <a href="tv_play-hdteleplay_20100211_7168445.html" title="斯巴达克斯:血与沙第2集"></a>
  27. => nil
  28.  
  29. # 虽然 table 里只有两个 a 元素, 但是这两个 a 元素仍然是在解析 test.html 之后生成的树结构上吊着的,
  30. # 在这两个 a 元素上求值形如 '//li' 这样的 XPath 表达式仍然会选择那颗树上的任意位置的 li 元素.
  31. # 这就是 '//' 在 XPath 表达式中的语义.
  32.  
  33. # 所以下面的语句的确删除了 doc 这棵树上的 class 为 expli 的 li 元素.
  34. irb(main):010:0> table.xpath('//li[@class="expli"]').remove
  35. => [#<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 ">]>]
  36.  
  37. # 但是从那颗树上删除那个 li 元素并没有从 table 这个 NodeSet 里移除那个 li 元素.
  38. # 我们的 table 长度仍然为 2.
  39. irb(main):011:0> table.length
  40. => 2
  41.  
  42. # 内容也还是原来的内容.
  43. irb(main):012:0> puts table
  44. <a href="tv_play-hdteleplay_20100211_7168444.html" title="斯巴达克斯:血与沙第1集"></a>
  45. <a href="tv_play-hdteleplay_20100211_7168445.html" title="斯巴达克斯:血与沙第2集"></a>
  46. => nil
  47.  
  48. # 但是那个 li 节点的确从解析 test.html 生成的树结构 doc 上被移除了.
  49. irb(main):013:0> doc.xpath('//li[@class="expli"]')
  50. => []
  51.  
  52. # 如果想得到删除那个 li 元素之后剩下的所有 li 元素的 NodeSet, 那再在 doc
  53. # 上求值 XPath 表达式 '/html/body/ul/li' 就好.
  54. irb(main):014:0> puts doc.xpath('/html/body/ul/li')
  55. <li>
  56. <a href="tv_play-hdteleplay_20100211_7168445.html" title="斯巴达克斯:血与沙第2集"></a>
  57. </li>
  58. => nil
  59.  
  60. # 在 table 上求值 XPath 表达式 '//ul/li' 也是一样的.
  61. irb(main):015:0> puts table.xpath('//ul/li')
  62. <li>
  63. <a href="tv_play-hdteleplay_20100211_7168445.html" title="斯巴达克斯:血与沙第2集"></a>
  64. </li>
  65. => nil
Add Comment
Please, Sign In to add comment