簡體   English   中英

從檢索到的頁面的JavaScript解析數據

[英]Parse data from JavaScript of retrieved page

我正在使用OpenURI檢索網頁:

require 'open-uri'
page = open('http://www.example.com').read.scrub

現在,我想解析檢索到的頁面的屬性playerurlplayerdatapageurl的值。 它們出現在<script>標記中:

<script>
..
..
  PlayerWatchdog.init({
      'playerurl': 'http://cdn.static.de/now/player.swf?ts=2011354353',
      'playerdata': 'http://www.example.com/player',
      'pageurl': 'http://www.example.com?test=2',
      });
..
..
</script>

什么是最明智的方式來做到這一點?

您可以使用HTML解析器(例如Nokogiri )來分解HTML文檔,並快速找到所需的<script>標記。 <script>標記內的內容是文本,因此Nokogiri的text方法將返回該text 然后,可以有選擇地檢索所需的行,可以通過一個簡單的正則表達式來完成:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<html>
  <head>
    <script>
      PlayerWatchdog.init({
          'playerurl': 'http://cdn.static.de/now/player.swf?ts=2011354353',
          'playerdata': 'http://www.example.com/player',
          'pageurl': 'http://www.example.com?test=2',
          });
    </script>
  </head>
</html>
EOT

script_text = doc.at('script').text 
playerurl, playerdata, pageurl = %w[
  playerurl
  playerdata
  pageurl
].map{ |i| script_text[/'#{ i }': '([^']+')/, 1] }

playerurl # => "http://cdn.static.de/now/player.swf?ts=2011354353'"
playerdata # => "http://www.example.com/player'"
pageurl # => "http://www.example.com?test=2'"

at返回第一個匹配的<script> Node實例。 根據HTML,您可能不需要第一個匹配的<script> 您可以改用search ,它會返回NodeSet ,類似於Nodes的數組,然后從NodeSet中獲取特定的元素,或者可以使用XPath代替CSS選擇器,從而輕松地指定特定的所需標簽的出現。

找到標簽后, text將返回其內容,任務將從Nokogiri轉到使用模式來查找所需內容。 /'#{ i }': '([^']+')/是尋找單詞的簡單模式,在i傳入,后跟: '然后捕獲所有內容,直到下一個' 該模式將傳遞給String的[]方法。

Ruby沒有內置的javascript解析功能。 您可以使用正則表達式,盡管它對頁面的格式非常敏感(例如,如果頁面開始使用雙引號來表示字符串,則該表達式會中斷):

playerurl = page[/'playerurl':\s*'([^']*)'/, 1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM