# Nokogiri 1.2.0 Released

**URL:** <https://www.ruby-forum.com/t/nokogiri-1-2-0-released/161068>\
**Category:** Ruby\
**Created:** [February 23, 2009, 5:23am UTC](https://www.ruby-forum.com/t/nokogiri-1-2-0-released/161068 "2009-02-23T05:23:33Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![aaronpowell](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7bcc69/32.png) [@aaronpowell](https://www.ruby-forum.com/u/aaronpowell)\
**Post date:** [February 23, 2009, 5:23am UTC](https://www.ruby-forum.com/t/nokogiri-1-2-0-released/161068/1 "2009-02-23T05:23:33Z")

</div>

nokogiri version 1.2.0 has been released!

- [http://nokogiri.rubyforge.org/](http://nokogiri.rubyforge.org/)
- [http://github.com/tenderlove/nokogiri/wikis](http://github.com/tenderlove/nokogiri/wikis)
- [http://github.com/tenderlove/nokogiri/tree/master](http://github.com/tenderlove/nokogiri/tree/master)
- [http://rubyforge.org/mailman/listinfo/nokogiri-talk](http://rubyforge.org/mailman/listinfo/nokogiri-talk)
- [http://nokogiri.lighthouseapp.com/projects/19607-nokogiri/overview](http://nokogiri.lighthouseapp.com/projects/19607-nokogiri/overview)

Nokogiri (é‹¸) is an HTML, XML, SAX, and Reader parser.

Changes:

### 1.2.0 / 2008-02-22

- New features

- Bugfixes

- Deprecations

- API Changes

## FEATURES:

- XPath support for document searching
- CSS3 selector support for document searching
- XML/HTML builder
- Drop in replacement for Hpricot (though not bug for bug)

Nokogiri parses and searches XML/HTML very quickly, and also has  
correctly implemented CSS3 selector support as well as XPath support.

Here is a speed test:

- [Result · GitHub](http://gist.github.com/24605)

Nokogiri also features an Hpricot compatibility layer to help ease the  
change  
to using correct CSS and XPath.

## SUPPORT:

The Nokogiri mailing list is available here:

- [http://rubyforge.org/mailman/listinfo/nokogiri-talk](http://rubyforge.org/mailman/listinfo/nokogiri-talk)

The bug tracker is available here:

- [Lighthouse - Beautifully Simple Issue Tracking](http://nokogiri.lighthouseapp.com/projects/19607-nokogiri/overview)

## SYNOPSIS:

require ‘nokogiri’  
require ‘open-uri’

doc =  
Nokogiri::HTML(open(‘[tenderlove - Google Search](http://www.google.com/search?q=tenderlove)’))

#### 

# Search for nodes by css

doc.css(‘h3.r a.l’).each do |link|  
puts link.content  
end

#### 

# Search for nodes by xpath

doc.xpath(‘//h3/a[@class=“l”]’).each do |link|  
puts link.content  
end

#### 

# Or mix and match.

doc.search(‘h3.r a.l’, ‘//h3/a[@class=“l”]’).each do |link|  
puts link.content  
end

## REQUIREMENTS:

- ruby 1.8 or 1.9
- libxml
- libxslt

## INSTALL:

- sudo gem install nokogiri

- [http://nokogiri.rubyforge.org/](http://nokogiri.rubyforge.org/)

- [http://github.com/tenderlove/nokogiri/wikis](http://github.com/tenderlove/nokogiri/wikis)

- [http://github.com/tenderlove/nokogiri/tree/master](http://github.com/tenderlove/nokogiri/tree/master)

- [http://rubyforge.org/mailman/listinfo/nokogiri-talk](http://rubyforge.org/mailman/listinfo/nokogiri-talk)

- [http://nokogiri.lighthouseapp.com/projects/19607-nokogiri/overview](http://nokogiri.lighthouseapp.com/projects/19607-nokogiri/overview)

---

<div class="post-metadata">

**Author:** ![aaronpowell](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7bcc69/32.png) [@aaronpowell](https://www.ruby-forum.com/u/aaronpowell)\
**Post date:** [February 23, 2009, 5:32am UTC](https://www.ruby-forum.com/t/nokogiri-1-2-0-released/161068/2 "2009-02-23T05:32:19Z")

</div>

Aaron P. wrote:

> nokogiri version 1.2.0 has been released!

grabbed! Tx!

---

<div class="post-metadata">

**Author:** ![aaronpowell](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7bcc69/32.png) [@aaronpowell](https://www.ruby-forum.com/u/aaronpowell)\
**Post date:** [February 23, 2009, 5:50am UTC](https://www.ruby-forum.com/t/nokogiri-1-2-0-released/161068/3 "2009-02-23T05:50:27Z")

</div>

Aaron P. wrote:

> nokogiri version 1.2.0 has been released!

The following is a question, if I got it wrong, and a code snippet if I  
didn’t.

To add nokogiri to a Merb project’s Cucumber featurizer, I…

Added it to features/support/env.rb:

require “merb-core”  
require “spec”  
require “merb\_cucumber/world/simple”  
require ‘nokogiri’ # \<-- with the correct style of quote ‘ticks’!

Added its calls to features/steps/result\_steps.rb

When /^you go to (.\*)/ do |text|  
@response = request(text)  
@xdoc = Nokogiri::HTML(@response.body.to\_s)  
end

Then /^you should see an? (.+) element$/ do |searcher|  
@xdoc.css(searcher).should\_not be\_nil  
end

Called its steps from features/comics.feature:

Feature: serve webcomics

```
 Scenario: root page
   When you go to /
   Then you should see an img.comic element

```

The result is the usual bunch of pale green. (But note that I personally  
suck at  
writing customer-facing verbiage. They don’t care if they see an img  
with a  
class of comic! They want to see a comic image! More verbiage tuning is  
in order…)

Also note that I suck at writing RSpec matchers. The point of all this  
is clear  
error messages at fault time, and my .should\_not be\_nil is also not  
particularly  
exemplary!

So thanks for the lib! it’s going to the top of my list from now on…

---

<div class="post-metadata">

**Author:** ![aaronpowell](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7bcc69/32.png) [@aaronpowell](https://www.ruby-forum.com/u/aaronpowell)\
**Post date:** [February 23, 2009, 7:54am UTC](https://www.ruby-forum.com/t/nokogiri-1-2-0-released/161068/4 "2009-02-23T07:54:31Z")

</div>

On Feb 22, 2009, at 20:49 , Phlip wrote:

> require ‘nokogiri’ # \<-- with the correct style of quote ‘ticks’!

huh?

---

<div class="post-metadata">

**Author:** ![aaronpowell](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7bcc69/32.png) [@aaronpowell](https://www.ruby-forum.com/u/aaronpowell)\
**Post date:** [February 23, 2009, 6:31am UTC](https://www.ruby-forum.com/t/nokogiri-1-2-0-released/161068/5 "2009-02-23T06:31:25Z")

</div>

> Then /^you should see an? (.+) element$/ do |searcher|  
> @xdoc.css(searcher).should\_not be\_nil  
> end

Nooop. I forgot to test that in the negative - by changing the Then  
commandment,  
and seeing if it fails cleanly. It did not, possibly because a failing  
CSS hit  
does not return a nil.

After changing to should\_not be\_blank, I then upgraded the verbiage in  
the  
featurizer:

Then /^you should see an? (.+) (.+)$/ do |style, element|  
element = { ‘image’ =\> ‘img’ }.fetch(element, element)  
@xdoc.css("#{element}.#{style}").should\_not be\_blank  
end

…

```
 When you go to /
 Then you should see a comic image

```

The {} is speculative coding; if I had a real client asking for these  
features,  
they might write ‘panel’, which I must then translate to

…
