2017-03-09 60 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

它看起來像是有JavaScript的更新'價值'基於'r-attr'屬性的值。用'Nokogiri'沒有辦法得到結果值。 – mudasobwa

+0

你不明白。當瀏覽器知道它時,您正在檢查頁面的DOM。 Nokogiri不是瀏覽器,它是一個解析器,它只是瀏覽器的一部分。所有Nokogiri知道的是HTML最初被檢索時的樣子,就像瀏覽器首次檢索HTML時一樣。但是,然後瀏覽器運行嵌入在頁面中的所有腳本,並處理CSS,然後向您顯示生成的修改頁面。當您檢查頁面時看到的內容反映了當前正在顯示的頁面,而不是最初收到的內容。 –

回答

0

你不能僅靠得到與引入nokogiri的價值,但是如果你使用一個工具,加載你可以得到它JavaScript之前,你得到的HTML。像這樣的一個工具是Selenium,它使用瀏覽器首先加載頁面。

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

您需要等待頁面上的某些更改才能知道js已完成。 你可以做到這一點具有一定的CSS標籤等待一些因素已經出現:

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

或只是等待一個設定的時間anount:

sleep(2) 

後的JavaScript已經改變的內容頁面,你會得到新的HTML源:

html_source = driver.page_source 
driver.quit 

然後你可以用引入nokogiri解析HTML:

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