2016-11-09 5 views
0

サイトをスクラップしようとしていますが、リンクで返された結果とブラウザで検査した結果が異なります。Nokogiriの結果がブラウザの検査と異なる

私のブラウザでは正常なリンクが得られますが、すべてのHREFリンクはすべてNokogiriのjavascript:void(0);になります。ここで

https://www.ctgoodjobs.hk/jobs/part-time 

が私のコードです:ここで

サイトです

url = "https://www.ctgoodjobs.hk/jobs/part-time" 
response = open(url) rescue nil 
next unless response 
doc = Nokogiri::HTML(open(url)) 
links = doc.search('.job-title > a').text 
+0

「[mcve]」をお読みください。あなたが書いたコードについて質問するとき、私たちは問題を示す質問に最小限のコードと最小限の入力データを期待しています。そうしないと、巨大なHTMLファイルから作業し、それらを使用可能な重要な部分に分離する必要があります。時間を無駄にすると、あなたを助ける能力が低下し、実際の問題が混乱する可能性があります。 –

答えて

1

は、容易ではありませんが、URLはJS関数を使用して、「隠される」あなたはjavascript: void(0)を取得している理由、それはですhrefsを尋ねるとき... htmlを見ると、各リンクのいくつかの隠された入力があります。あなたが探しているものなら、ジョブプレビューurlを作るために使うことができるプレビューURLがあります。あなたはこれを持っています:

<div class="result-list-job current-view"> 
    <input type="hidden" name="job_id" value="04375145"> 
    <input type="hidden" name="each_job_title_url" value="barista-senior-barista-咖啡調配員"> 
    <h2 class="job-title"><a href="javascript:void(0);">Barista/ Senior Barista 咖 啡 調 配 員</a></h2> 
    <h3 class="job-company"><a href="/company-jobs/pacific-coffee-company/00028652" target="_blank">PACIFIC COFFEE CO. LTD.</a></h3> 
    <div class="job-description"> 
    <ul class="job-desc-list clearfix"> 
     <li class="job-desc-loc job-desc-small-icon">-</li> 
     <li class="job-desc-work-exp">0-1 yr(s)</li> 
     <li class="job-desc-salary job-desc-small-icon">-</li> 
     <li class="job-desc-post-date">09/11/16</li> 
    </ul> 
    </div> 
    <a class="job-save-btn" title="save this job" style="display: inline;"> </a> 
    <div class="job-batch-apply"><span class="checkbox" style="background-position: 0px 0px;"></span><input type="checkbox" class="styled" name="job_checkbox" value="04375145"></div> 
    <div class="job-cat job-cat-de"></div> 
</div> 

そして、あなたは同様に、これらの入力から各JOB_IDを取得することができます。

inputs = doc.search('//input[@name="job_id"]') 

してからURLを構築する(私はjoblist_preview.jsでベースURLを見つけました:

urls = inputs.map do |input| 
    "https://www.ctgoodjobs.hk/english/jobdetails/details.asp?m_jobid=#{input['value']}&joblistmode=previewlist&ga_channel=ct" 
end 
0

はの出力を取りますブラウザとwgetcurl、または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"も参照してください。

関連する問題