输入值如何工作?

How does input value work?

网页中有输入标签。当我检查它时:

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

您无法单独使用 Nokogiri 获取值,但是如果您使用在获取 html 之前加载 javascript 的工具,则可以获取该值。 Selenium 就是这样的一种工具,它首先使用浏览器加载页面。

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

你需要等待页面上的一些变化,才能知道js已经完成。 您可以通过等待带有特定 css 标签的元素出现来做到这一点:

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

或者等待一段时间:

sleep(2)

在 javascript 更改页面内容后,您将获得新的 html 来源:

html_source = driver.page_source
driver.quit

然后你可以使用Nokogiri来解析html:

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