2013-09-24 86 views
2

我解析HTML頁面與幾個腳本塊:從HTML頁面中提取JavaScript函數的參數與BeautifulSoup

<script type="text/javascript"> 
    // some code 
</script> 
<script type="text/javascript"> 
    foo(arg1, arg2); 
    // some code 
</script> 

我需要提取FOO的參數功能 - 「ARG1」和'ARG2'。目前,我可以得到腳本標籤內內容:

def parse_foo(pageContent): 
    soup = BeautifulSoup(pageContent) 
    scriptTags = soup.find_all('script') 
    for script in scriptTags: 
     tagContent = script.get_text() 
     if tagContent.count('foo') > 0: 
      return tagContent 
    return '' 

有沒有什麼辦法讓使用BeautifulSoup或參數我應該使用正則表達式?

+0

無論你決定,不要使用正則表達式。 – That1Guy

+0

你爲什麼需要參數? – That1Guy

+0

@ That1Guy請證明爲什麼'/^\ s * foo \((。*)\); $ /'不起作用? – Brian

回答

3

pyesprima是Esprima的一個端口,「用ECMAScript編寫的高性能,符合標準的ECMAScript解析器」。幸運的是,它很容易使用。不幸的是,它有點慢。

甚至還有使用在線分析器工具:http://esprima.org/demo/parse.html

當我輸入foo(arg1,arg2);,這回來:

{ 
    "type": "Program", 
    "body": [ 
     { 
      "type": "ExpressionStatement", 
      "expression": { 
       "type": "CallExpression", 
       "callee": { 
        "type": "Identifier", 
        "name": "foo" 
       }, 
       "arguments": [ 
        { 
         "type": "Identifier", 
         "name": "arg1" 
        }, 
        { 
         "type": "Identifier", 
         "name": "arg2" 
        } 
       ] 
      } 
     } 
    ] 
} 

樹:

   ExpressionStatement 
         | 
        expression 
       / |  \ 
type=callExpression callee arguments 
         |  
        name=foo 
  1. 查找與ExpressionStatement一個名爲「foo」的expression.callee.name。
  2. 返回ExpressionStatement的arguments.raw(您需要提供「原始」選項,這樣,請參閱文檔)
+0

我的任務不是關鍵性能,所以這正是我需要的。謝謝! – Vladimir

0

BeautifulSoup僅關注標籤下標籤,標籤屬性和標籤子樹。 從它的角度來看,你的整個JavaScript只是文本。

如果您的JavaScript代碼確實非常受限制,您可能會遇到正則表達式。
但是,如果它更復雜一點,那可能是通往地獄之路。

然後邏輯步驟就是使用JavaScript解析器。 Python中的一個(pyesprima)或您提供的任何其他文件和 通過進程間通信詢問。

相關問題