はの出力を取りますブラウザとwget
、curl
、またはnokogiri
のようなツールの場合、ブラウザーの表示内容がHTMLと大きく異なる場合があります。
最近、ブラウザではDHTMLを処理できますが、Nokogiriでは処理できません。 HTMLは、上記のツールのようなブラウザを使わずにコンテンツを見ることができ、テキストエディタで見たものと比較するか、nokogiri
に表示されるものを使用してHTMLを取り出すことができます。ブラウザを信用しないでください - 彼らはあなたを幸せにしたいので嘘をつくことが知られています。
はここで生のHTMLが含まれているものに迅速に垣間見ることだ、使用して生成:
:ヒットを数える
Your document is stored in @doc...
Welcome to NOKOGIRI. You are using ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]. Have fun ;)
セレクタ戻っによって発見:
$ nokogiri "https://www.ctgoodjobs.hk/jobs/part-time"
鋸山はIRBに私を落とし
>> @doc.search('.job-title > a').size
30
見つかったテキストを表示すると、
>> @doc.search('.job-title > a').map(&:text)
[
[ 0] "嬰 兒 奶 粉 沖 調 機 - 兼 職 產 品 推 廣 員 Part Time Promoter (時 薪 高 達 HK$90, 另 設 銷 售 佣 金)",
...
[29] "Customer Services Representative (Part-time)"
]
実際href
を見る:
>> @doc.search('.job-title > a').map{ |n| n['href'] }
[
[ 0] "javascript:void(0);",
...
[29] "javascript:void(0);"
]
DHTMLを処理し、あなたが鋸山があなたを語っているもの以外のものが含まれていないHTMLを伝えることができるので、ブラウザがHTMLをポスト処理していると何かを使ってHTMLを見た場合に表示されるページを変更します。したがって、短い修正は、サーバーがあなたに送信するものを知りたければ、ブラウザーを信頼しないでください。
これはスクレイピングがあまり信頼できないため、可能な限りAPIを使用する必要がある理由です。できない場合は、あなたはあなたの袖を巻いてJavaScriptを掘り下げ、それが何をしているのかを手作業で解釈し、データを取り出し、それを何か有益なものに解析する必要があります。
コードをクリーンアップして簡略化することができます。 search(...).text
の使用は大きな間違いである
url = "https://www.ctgoodjobs.hk/jobs/part-time"
doc = Nokogiri::HTML(open(url))
links = doc.search('.job-title > a').map(&:text)
:私は単にはるかにそれを書くと思います。 text
をNodeSetに適用すると、含まれている各ノードのテキストが連結され、個々のテキストを取得することが非常に困難になります。最初の結果foobar
が有用であることが離れて分割される必要になる、とあなたは、コンテンツの特別な知識を持っていない限り、それを行う方法を把握しようとすると、主要な痛みになります
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
<p>bar</p>
</body>
</html>
EOT
doc.search('p').class # => Nokogiri::XML::NodeSet
doc.search('p').text # => "foobar"
doc.search('p').map(&:text) # => ["foo", "bar"]
:これを考えてみましょう。
代わりにmap
を使用して要素を反復処理し、それぞれに&:text
を適用して、各要素のテキストの配列を返します。
""と "Taking apart a DHTML page"も参照してください。
「[mcve]」をお読みください。あなたが書いたコードについて質問するとき、私たちは問題を示す質問に最小限のコードと最小限の入力データを期待しています。そうしないと、巨大なHTMLファイルから作業し、それらを使用可能な重要な部分に分離する必要があります。時間を無駄にすると、あなたを助ける能力が低下し、実際の問題が混乱する可能性があります。 –