2017-03-09 24 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']