使用Nokogiri的一些例子?

问题描述 投票:7回答:1

我正在尝试了解Nokogiri。是否有人链接到Nokogiri分析/显示显示结果树的基本示例的链接。认为这确实有助于我的理解。

ruby nokogiri
1个回答
10
投票

使用IRB和Ruby 1.9.2:

加载Nokogiri:

> require 'nokogiri'
#=> true

解析文档:

> doc = Nokogiri::HTML('<html><body><p>foobar</p></body></html>')
#=> #<Nokogiri::HTML::Document:0x1012821a0
      @node_cache = [],
      attr_accessor :errors = [],
      attr_reader :decorators = nil

Nokogiri喜欢格式良好的文档。请注意,它添加了DOCTYPE,因为我将其解析为文档。也可以将其解析为文档片段,但这非常专业。

> doc.to_html
#=> "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p>foobar</p></body></html>\n"

使用CSS搜索文档以找到第一个<p>节点并获取其内容:

> doc.at('p').text
#=> "foobar"

使用不同的方法名称执行相同的操作:

> doc.at('p').content
#=> "foobar"

在文档中搜索<p>标记内的所有<body>节点,并获取第一个节点的内容。 search返回一个节点集,就像一个节点数组。

> doc.search('body p').first.text
#=> "foobar"

这是很重要的一点,当初使用Nokogiri时,几乎每个人都会感到震惊。 search及其cssxpath变体返回NodeSet。 NodeSet.textcontent将所有返回的节点的文本连接到一个字符串中,这使得非常难以再次分解。

使用一些不同的HTML可以说明这一点:

> doc = Nokogiri::HTML('<html><body><p>foo</p><p>bar</p></body></html>')
> puts doc.to_html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>foo</p>
<p>bar</p>
</body></html>

> doc.search('p').text
#=> "foobar"

> doc.search('p').map(&:text)
#=> ["foo", "bar"]

返回到原始HTML ...

更改节点的内容:

> doc.at('p').content = 'bar'
#=> "bar"

将已解析的文档发送为HTML:

> doc.to_html
#=> "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p>bar</p></body></html>\n"

删除节点:

> doc.at('p').remove
#=> #<Nokogiri::XML::Element:0x80939178 name="p" children=[#<Nokogiri::XML::Text:0x8091a624 "bar">]>
> doc.to_html
#=> "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body></body></html>\n"

关于抓取,关于使用Nokogiri将HTML与网站分离的问题很多。在StackOverflow中搜索“ nokogiri and open-uri”应该有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.