2016-11-09 2 views
0

사이트를 다 써 버리려고하는데 링크만으로 반환 된 결과가 브라우저에서 검사 할 때와 다릅니다.Nokogiri 결과가 브라우저 검사와 다릅니다.

내 브라우저에는 정상 링크가 있지만 모든 HREF 링크는 모두 Nokogiri의 javascript:void(0);이됩니다. 여기

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

내 코드입니다 : 여기

사이트 당신이 javascript: void(0)을 얻고있는 이유

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 기능을 사용하여 "가려", 즉이다 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> 

다음, 당신이 좋아, 그 입력에서 각각의 작업 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

이의 출력을 가지고 브라우저와 wget, curl 또는 nokogiri과 같은 도구를 사용하면 브라우저 HTML이 원시 HTML과 크게 다를 수 있습니다.

요즘 브라우저는 DHTML을 처리 할 수 ​​있습니다. Nokogiri는 그렇지 않습니다. HTML은 브라우저없이 콘텐츠를 볼 수있는 도구 (예 : 위에서 언급 한 도구)를 검색 한 다음 텍스트 편집기에 표시되는 내용과 비교하거나 nokogiri에 표시되는 내용을 사용하여 검색 할 수 있습니다. 브라우저를 신뢰하지 마십시오. 그들은 당신을 행복하게 만들기 위해 거짓말하는 것으로 알려져 있습니다.

여기 원시 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를 사용해야합니다.그렇게 할 수 없다면 슬리브를 굴리고 자바 스크립트를 파고 자신이하는 일을 수작업으로 해석 한 다음 데이터를 검색하고 유용한 것으로 파싱해야합니다.

코드를 정리하고 단순화 할 수 있습니다.

url = "https://www.ctgoodjobs.hk/jobs/part-time" 
doc = Nokogiri::HTML(open(url)) 
links = doc.search('.job-title > a').map(&:text) 

search(...).text의 사용은 큰 실수이다 : 나는 훨씬 더 간단하게 쓸 것입니다. text을 NodeSet에 적용하면 포함 된 각 노드의 텍스트가 연결되어 개별 텍스트를 가져 오는 것이 매우 어렵습니다. 이것을 고려하십시오 :

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"] 

당신이 큰 고통이 될 것이다하는 방법을 알아 내려고 노력하고, 컨텐츠의 특별한 지식이 없다면 foobar가 유용하게 갈라, 그리고되고 필요 첫 번째 결과.

대신 map을 사용하여 요소를 반복하고 각각 &:text을 적용하여 각 요소의 텍스트 배열을 반환하십시오.

""및 "Taking apart a DHTML page"도 참조하십시오.

관련 문제