Nokogiri使用教程

2021-07-12 06:20:31 字數 3202 閱讀 2590

nokogiri是ruby的gem,常用來解析xml/html,爬取網路資料等.

安裝方式

基礎語法

直接以字串形式獲取nokogiri物件:

html_doc = nokogiri::html("

")

xml_doc = nokogiri::xml("alf

")

這裡的html_doc和xml_doc就是nokogiri檔案,它們可用的方法在這裡

也可以通過檔案控制代碼獲取nokogiri物件:

f = file.open("blossom.xml")

doc = nokogiri::xml(f)

f.close

還可以直接從**獲取:

require 'open-uri' doc = nokogiri::html(open(""))

可選項nokogiri提供了一些解析檔案時的可選項,常用的有:

從xml/html檔案裡抓取欄位的常用方法:

現在有乙個名為shows.xml的檔案,內容如下:

married with childrenname>

al bundycharacter>

bud bundycharacter>

marcy darcycharacter>

characters>

sitcom>

perfect strangersname>

balki bartokomouscharacter>

characters>

sitcom>

sitcoms>

the a-teamname>

john "hannibal" smithcharacter>

templeton "face" peckcharacter>

"b.a." baracuscharacter>

"howling mad" murdockcharacter>

characters>

drama>

dramas>

root>

如果想把所有character標籤的內容查詢出來,可以這樣處理:

@doc = nokogiri::xml(file.open("shows.xml"))

@doc.xpath("//character")

xpath和css方法,返回的是乙個結點列表,類似於乙個陣列,它的內容就是從檔案中查詢出來的符合匹配規則的結點.

把dramas結點裡的character結點列表查出來:

@doc.xpath("//dramas//character")

更有可讀性的css方法:

characters = @doc.css("sitcoms name")

# => ["married with children", "perfect strangers"]

當已知查詢結果唯一時,如果想直接返回這個結果,而不是列表,可以直接使用at_xpath或at_css:

@doc.css("dramas name").first # => "the a-team"

@doc.at_css("dramas name") # => "the a-team"

namespaces

對於有多個標籤的情況,命名空間就起到非常大的作用了.

例如有這樣乙個parts.xml檔案:

xmlns="">

all weathertire>

studdedtire>

extra widetire>

inventory>

xmlns="">

streettire>

mountaintire>

inventory>

parts>

可以使用唯一的url作為namespaces,以區分不同的tires標籤:

@doc = nokogiri::xml(file.read("parts.xml"))

car_tires = @doc.xpath('//car:tire', 'car' => '')

bike_tires = @doc.xpath('//bike:tire', 'bike' => '')

為了讓namespace的使用更方便,nokogiri會自動繫結在根結點上找到的合適的任何namespace.

nokogiri會自動關聯提供的url,這個慣例可以減少**量.

例如有這樣乙個atom.xml檔案:

xmlns="">

example feedtitle>

href=""/>

2003-12-13t18:30:02zupdated>

john doename>

author>

urn:uuid:60a76c80-d399-11d9-b93c-0003939e0af6id>

atom-powered robots run amoktitle>

href="2003/12/13/atom03"/>

urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6aid>

2003-12-13t18:30:02zupdated>

some text.summary>

entry>

feed>

遵循上面提到的慣例,xmlns已被自動繫結,不用再手動為xmlns賦值:

@doc.xpath('//xmlns:title')

# => ["example feed", "atom-powered robots run amok"]

同樣情況,css的用法:

@doc.css('xmlns|title')

並且在使用css方式時,如果namespaces名字是xmlns,那麼連這個詞本身都可以忽略掉:

@doc.css('title')

Nokogiri 中文亂碼的幾種情況

color red 更新 color 2011 11 15 有些不是ie上的了 如果不確定目標是什麼編碼,ruby1.9開始可以用string類內建的encoding來得到編碼。puts iconv.iconv utf 8 doc.to s.encoding.to s,doc 使用 ignore忽略...

SVN使用使用教程

本人在公司孤兒式開發,是用不到svn這種工具的,但是怕突然某一天電腦壞掉,消失所以還是使用上 管理工具。簡單概括一下svn它是 幹什麼的 一群人寫 每乙個人寫的部分都不一樣,但是專案是乙個整體,每個人的 需要合到一起才是乙個完整的專案,但是每乙個人寫的 又不可能出現在其他人的電腦上,所以使用svn專...

Git使用教程

提起git,大家無疑會想到github,沒錯,我就是通過眾多的github專案鏈結了解到的git,不知你是否也在走這條路呢?如果是的話,本文有一些有用的總結性文字以及一些 git教程 可以教會你如何去使用 git.當然,這些對 github 同樣適用.這裡我又翻到了個幻燈片,可以供大家 寫給大家的 ...