#author("2022-07-07T06:03:28+00:00","default:src128","src128") #author("2022-07-07T06:06:58+00:00","default:src128","src128") &tag(nokogiri); *目次 [#c53d93ad] #contents *関連ページ [#j13318ad] -[[Ruby]] -[[Rails]] -[[XPath]] *参考情報 [#vdf1f104] -[[Tutorials - Nokogiri 鋸:http://www.nokogiri.org/]] -[[鋸の使い方 🪚 - Qiita:https://qiita.com/tommy-012/items/07fa571232a9b8bb96de]] *HTMLの解析 [#jbbb2018] **基本 [#ibe68ab8] -xpathあるいはcssで要素を指定できる。[[XPath]] -xpathを指定。 #pre{{ html=<<__EOM__ <html> <head><title>デモサイト</title></head> <body> <h1>見出し</h1> <div class="container"> <div class="row">行1 </div> <div class="row">行2 </div> </div> </body> </html> __EOM__ doc = Nokogiri::HTML.parse(html, nil, 'utf-8') p doc.title nodesets = doc.xpath("//div[@class='row']") p nodesets.class p nodesets.text p nodesets.first.class p nodesets.first.text }} -実行結果。 #pre{{ $ ruby demo.rb "デモサイト" Nokogiri::XML::NodeSet "行1\n 行2\n " Nokogiri::XML::Element "行1\n " }} -複数マッチする場合は、Nokogiri::XML::NodeSet、一個の場合はNokogiri::XML::Elementが帰ってくるのか **Nokogiri::XML::Elementのメソッド [#n0e30ded] ***inner_html [#o4b0a059] タグの内部(HTML残す) ***text [#t439c7f5] テキスト化した内容 ***to_html [#z4e66207] -自分自身を含めたhmtl -自分自身を含めたhmtl(outer_htmlか。これに該当するtext系メソッドは存在しない?innerと一致するためか?)。 **検索系メソッド [#c49b94f0] -[[Module: Nokogiri::XML::Searchable — Documentation by YARD 0.9.25:https://nokogiri.org/rdoc/Nokogiri/XML/Searchable.html]] -[[Searching a XML/HTML document - Nokogiri:https://nokogiri.org/tutorials/searching_a_xml_html_document.html]] -cssかxpathを使用して検索できる。 -atとsearchは、cssとxpathどっちも指定できる。 -at、at_css、at_xpathは最初の1つを返す(なければnull)。search、css、xpathは複数の結果を返す。 ***at [#q48109a0] -XPath or CSSクエリで最初の要素を検索 ***at_css [#w888e921] -CSSクエリで最初の要素を検索 ***at_xpath [#bebc4406] -XPathで最初の要素を検索 ***css [#r3145d5e] -CSSクエリで複数要素を検索 ***search [#rbe56093] -XPath or CSSクエリで複数要素を検索 ***xpath [#n8347510] -XPathで複数要素を検索 *トラブルシューティング [#vea569ad] **IMPORTANT! Nokogiri builds and uses a packaged version of libxslt.って何? [#k7f4746b] -nokogiriが自前パッケージ版のlibxml2を使っているらしい。[[nokogiriのインストールでハマった件 - ひろうぃんの雑記:http://heroween.hateblo.jp/entry/2014/05/25/164302]]によるとシステム版のlibxml2を使うようにもできるらしいけど、とりあえずそのままでも良さそう。 **Yosemite環境でインストールできない [#s1ccccff] -railsなどをbundle installするときnokogiriが一緒にインストールされるのだが、これが失敗する。 -失敗する場合、nokogiri単体でインストールして状況を確認 gem install nokogiri -v '1.6.5' -以下のエラーメッセージでコンパイル失敗 #pre{{ checking for xmlParseDoc() in -llibxml2... no ----- libxml2 is missing. Please locate mkmf.log to investigate how it is failing. ----- }} -mkmf.logを確認すると(findで探せる)、libxml2が存在しないのではなく(デフォルトでnokogiriに同梱されているのでありえない)iconv関連のエラーのようだ。 #pre{{ Undefined symbols for architecture x86_64: "_iconv", referenced from: _main in conftest-a4367a.o "_iconv_open", referenced from: _main in conftest-a4367a.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) checked program was: }} -homebrewを使ってlibiconvをむりくり認識させる解放はあるようだが、MacPortsの場合どうやればいいか不明。 -とりあえず、環境変数を使って、システムライブラリを使うように指示したらコンパイルできた(環境変数が定義されていればよく、値はなんでもいいみたい) export NOKOGIRI_USE_SYSTEM_LIBRARIES=1 -もしくはつぎのように実行 NOKOGIRI_USE_SYSTEM_LIBRARIES=1 bundle install --path vendor/bundle/ *** extconf.rb failed *** [#ka5ec7fa] Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. }} **macOS High Sierraでエラー [#i5276594] 2018/12/07(金)なぜかこれまで「 NOKOGIRI_USE_SYSTEM_LIBRARIES=1」でビルドできていたRailsプロジェクトがビルドできなくなった。以下のようなエラーメッセージが表示される。 #pre{{ Installing nokogiri 1.8.5 with native extensions Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /Users/sora/work/myproject/vendor/bundle/ruby/2.5.0/gems/nokogiri-1.8.5/ext/nokogiri /Users/sora/.anyenv/envs/rbenv/versions/2.5.1/bin/ruby -r ./siteconf20181207-55660-1avexke.rb extconf.rb checking if the C compiler accepts ... yes checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no Building nokogiri using system libraries. pkg-config could not be used to find libxml-2.0 Please install either `pkg-config` or the pkg-config gem per gem install pkg-config -v "~> 1.1" pkg-config could not be used to find libxslt Please install either `pkg-config` or the pkg-config gem per gem install pkg-config -v "~> 1.1" pkg-config could not be used to find libexslt Please install either `pkg-config` or the pkg-config gem per gem install pkg-config -v "~> 1.1" ERROR: cannot discover where libxml2 is located on your system. please make sure `pkg-config` is installed. *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. }} NOKOGIRI_USE_SYSTEM_LIBRARIESを指定しないか、以下のようにlibxmlのパスを明示すればインストールできた。 gem install nokogiri -- --use-system-libraries --with-xml2-config=/opt/local/bin/xml2-config --with-xslt-config=/opt/local/bin/xslt-config NOKOGIRI_USE_SYSTEM_LIBRARIESを指定しなければいいのだが原因がわからない。OSは10.13.6のままかわっていないので、Xcodeのせい?