2017-03-09 5 views
0

웹 페이지에 입력 태그가 있습니다.입력 값은 어떻게 작동합니까?

<input type="text" onmouseover="this.select();" readonly="" value="<embed src=&quot;https://imgcache.qq.com/tencentvideo_v1/playerv3/TPout.swf?max_age=86400&amp;v=20161117&amp;vid=d0380tpvuqx&amp;auto=0&quot; allowFullScreen=&quot;true&quot; quality=&quot;high&quot; width=&quot;480&quot; height=&quot;400&quot; align=&quot;middle&quot; allowScriptAccess=&quot;always&quot; type=&quot;application/x-shockwave-flash&quot;></embed>"> 

을하지만 나는 그것의 '페이지 소스를 볼 때 : 나는 그것을 검사 할 때

<input type="text" onmouseover="this.select();" readonly r-attr="{value:shareHtml}"> 

은 어떻게 작동 하는가? 내가 nokogiri하여 입력 값을 얻을 수있는 방법 그리고 분석 결과는 다음과 같습니다 이후 :

#<Nokogiri::XML::Element:0x3fcc71309c60 name="input" attributes=[#<Nokogiri::XML::Attr:0x3fcc71309be8 name="type" value="text">, #<Nokogiri::XML::Attr:0x3fcc71309bd4 name="onmouseover" value="this.select();">, #<Nokogiri::XML::Attr:0x3fcc71309bc0 name="readonly" value="readonly">, #<Nokogiri::XML::Attr:0x3fcc71309bac name="r-attr" value="{value:shareHtml}">]> 
+1

'r-attr' 속성의 값을 기반으로'value'를 업데이트하는 javascript가있는 것 같습니다. 'Nokogiri '로 결과 값을 얻을 수있는 방법이 없습니다. – mudasobwa

+0

당신은 그것을 얻을 수 없습니다. 브라우저가 알고있는 것처럼 페이지의 DOM을 검사하고 있습니다. Nokogiri는 브라우저가 아니며 파서 (parser)입니다. 브라우저는 브라우저의 일부입니다. Nokogiri가 알고있는 모든 것은 HTML이 처음 검색 될 때 브라우저가 처음 검색 할 때처럼 HTML이 어떻게 보이는지를 나타냅니다. 그런 다음 브라우저는 페이지에 포함 된 모든 스크립트를 실행하고 CSS를 처리 한 다음 수정 된 페이지를 표시합니다. 페이지를 검사 할 때 표시되는 내용은 원래 표시되었던 페이지가 아닌 현재 표시된 페이지를 반영합니다. –

답변

0

당신은 혼자 노코 기리와 값을 얻을 수 없다, 당신은로드되는 도구를 사용하는 경우 그러나 당신이 그것을 얻을 수 있습니다 자바 스크립트 전에 HTML을 얻을. 이 도구는 Selenium이 될 것입니다. Selenium은 브라우저를 사용하여 페이지를 먼저로드합니다.

driver = Selenium::WebDriver.for :firefox 
driver.get("https://www.google.com") 

js가 완료되었음을 알기 위해 페이지의 일부 변경을 기다려야합니다. 당신은 어떤 CSS를 태그로 몇 가지 요소를 기다리고하여 해당 작업을 수행 할 수 있습니다 등장했습니다

driver.find_element(:css, '#some-id') 

하거나 일정 시간 anount 기다립니다

sleep(2) 

을 자바 스크립트의 내용을 변경 한 후

:

html_source = driver.page_source 
driver.quit 

그런 다음 당신은 HTML을 구문 분석 노코 기리를 사용할 수 있습니다 페이지, 새 HTML 소스를 얻을

doc = Nokogiri::HTML(html_source) 
doc.at('input')['value']