我正在尝试了解Nokogiri。是否有人链接到Nokogiri分析/显示显示结果树的基本示例的链接。认为这确实有助于我的理解。
使用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
及其css
和xpath
变体返回NodeSet。 NodeSet.text
或content
将所有返回的节点的文本连接到一个字符串中,这使得非常难以再次分解。
使用一些不同的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”应该有所帮助。