이의 출력을 가지고 브라우저와 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"도 참조하십시오.
"[mcve]"을 (를) 읽으십시오. 작성한 코드에 대해 질문 할 때 문제를 나타내는 질문에 최소한의 코드와 최소한의 입력 데이터가 필요합니다. 그렇게하지 않으면 커다란 HTML 파일에서 작업하여 사용 가능한 중요한 파트로 분리해야하므로 시간을 낭비하는 것은 우리의 능력을 저하시키고 잠재적 인 문제를 혼란스럽게합니다. –