document

ruby nokogiri スクレイピング

これが一番役に立った

スクレイピングのためのNokogiri利用メモ - それはそれ。これはこれ。 http://d.hatena.ne.jp/otn/20090509/p1

	(3) 基本的な処理パターン
	Document 等の Nokogiri::XML::Node または Nokogiri::XML::NodeSet オブジェクトに対して、
	CSSセレクタやXPathで検索を行い、検索結果として Nokogiri::XML::NodeSet オブジェクトを得る。
	NodeSetはArrayのようなもので、eachや[]でNodeのサブクラスのElementを得て、情報を得る。
	tds=doc.xpath("//td") # => tdタグの検索(NodeSetオブジェクト)
	tds.size              # => tdタグの個数
	tds[0]                # => 最初のtdタグ(Elementオブジェクト)
	tds[0]["class"]       # => 最初のtdタグのclass名(String)
	tds[0].xpath(".//a")  # => さらにその中のaタグを探す(NodeSetオブジェクト)

あと個人的に使ったのは

doc.xpath("//td").to_s # => 一致したノード以下の文字列を返す
#ノードのpathを表示して配置を理解する
doc.xpath("//td").each do |v|
	print 'aaaaaaaaaa' + NKF.nkf(opt,v.path) + "aaaaaaaaaaa\r\n"
end
tds[0].previous #前のノード(同じ条件に引っかかったノードではない。全体から見たノードの次のノード)
tds[0].next #次のノード
tds[0].parent #親ノード
親ノードまで行って、そこからnextとかを使った.

自分が欲しかったのはこれで大体とれた

	doc.xpath('/html/body/div[3]/div[2]/div').each do |v|
		cqid = v.xpath('./input[@name="CQID"]')
		if(cqid.length != 0)
				print 'title_str=' + NKF.nkf(@opt,v.previous.previous.to_s) + "\r\n"
		end
	end

https://lh5.googleusercontent.com/_5pNZbDuNbEI/TWRwFHrs_qI/AAAAAAAAFTQ/aumgt9eah70/s1000/nokogiri_node.png

xpath

XPath入門、実用例 - 素人がプログラミングを勉強するブログ http://d.hatena.ne.jp/javascripter/20080425/1209094795

alt属性もtitle属性も持つimg要素
   //img[@alt and @title] 

のようにタグ要素と[]のなかに属性を書いて、それのandとかorとかnot()を使う

@IT:XML文書内の位置を正確に指し示すXPath http://www.atmarkit.co.jp/fxml/rensai/rexml08/rexml08.html

XML Path Language - Wikipedia http://ja.wikipedia.org/wiki/XML_Path_Language

nokogiri 文字コード 対策

nokogiriはUTF-8以外のWEBサイトに対して解析すると、文字化けを起こす時がある。

文字化けの対策のためにnkfを使った。

@opt = "-w -S -xm0"
#こんなタグのxxxxxxxを取ってくる <input name="CQID" value="xxxxxxx"/>
cqid = vv.xpath('./input[@name="CQID"]')
print 'cqidcqidcqid=' + NKF.nkf(@opt,cqid[0]["value"]) + "\r\n"
  • 参考リンク

yahooでスクレイピングしたときのコード 2012 追記

def get_yahoo_tv_program_data(yahoo_url)
 
 doc = Nokogiri::HTML(open(yahoo_url))
 doc.xpath('//h2/b').each do |h2|
   print h2.inner_text
   p "title !!!!!!!!!!!!!!!!!!!!!!!!"
 end
 doc.xpath('//p[@class="time_xxxx"]/em').each do |time|
   print time.inner_text
   p "time !!!!!!!!!!!!!!!!!!!!!!!!" 
 end
end

その他

実践スクレイピング/第42回 Ruby/Rails勉強会@関西 - もぎゃろぐ http://blog.mogya.com/2010/04/42-rubyrails.html

  • 一度スクレイピングしたデータをHTMLなどに出力するときに目次を付けるのに便利

[う] CSSでHTMLの一番下に書いたものをヘッダー部分に表示させる方法 http://www.uka-blog.com/web/html_css/entry_001299.php


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-06-25 (月) 23:48:57 (1460d)