2

いくつかのスクリプトブロックを含む HTML ページを解析しています。

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

foo関数の引数「arg1」と「arg2」を抽出する必要があります。現在、 scriptタグの内部コンテンツを取得できます。

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 を使用して引数を取得する方法はありますか、それとも正規表現を使用する必要がありますか?

4

2 に答える 2

3

pyesprimaは、「ECMAScript で書かれた高性能で標準準拠の ECMAScript パーサー」である Esprima のポートです。幸いなことに、使い方は簡単です。残念ながら、それは少し遅いです。

使用するオンライン パーサー ツールもあります: 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. 「foo」というexpression.callee.nameを持つExpressionStatementを探します。
  2. ExpressionStatement の arguments.raw を返します (「raw」オプションを True として指定する必要があります。ドキュメントを参照してください)
于 2013-09-24T16:22:03.250 に答える
0

BeautifulSoup は、タグ、タグの属性、およびタグの下のタグのサブツリーのみに関係しています。その観点からは、JavaScript 全体が単なるテキストです。

JavaScript コードが確実に非常に制限されている場合は、正規表現でうまくいく可能性があります。
しかし、もう少し複雑な場合、それは地獄への道かもしれません.

論理的なステップは、javascript パーサーを使用することです。Python のもの ( pyesprima )、またはプロセス間通信を介してフィードおよび要求するその他のいずれか。

于 2013-09-24T16:21:12.333 に答える