2012-01-07 7 views
0

私は文字列からトークンを見つけようとしています。私は他の文字列でこのメソッドを使用していますが、正常に動作しますが、この結果は返されません。 findallではなく、検索ではありません。python regex matching、findallまたはsearchが値を返さない

pattern= re.compile(r'<input class="token" value="(.+?)" name="csrftoken_reply">') 
    matches = pattern.findall(htmlstring) 
    for match in matches: 
     print match 

各応答文字列には1つの値しかありません。私は「印刷一致」

のための結果を得ていないのですけれども、私もre.searchを使ってみましたが、同じことが起こる、NoneTypeオブジェクトが返されます...

MORE INFO:

この私はパースだHTMLの一部です:

<form id="threadReplyForm" class="clearfix" method="post" action="/go/messages/private/threadID=0551796"> 
<input class="csrftoken" type="hidden" value="a7b161b7" name="csrftoken_reply"> 
<input type="hidden" value="reply" name="action"> 
<div class="editorWrapper"> 
<div id="premiumSmiliesNotAllowed" class="warning" style="display: none;"> 
<div id="editor_13" class="clearfix editor" mode="full"> 
<ul id="editorToolbar_13" class="editorToolbar clearfix"> 
<textarea id="messageInput" class="autogrow" cols="20" rows="8" name="message"></textarea> 
<div id="previewDiv" class="previewArea" style="display: none;"></div> 
</div> 
<script> 
</div> 
<script> 
<span class="loadingIndicator right loadingIndicatorMessage"> 
<p class="clearfix"> 
</form> 

これで、それを解析:

pattern= re.compile(r'<input class="csrftoken" type="hidden" value="(.+?)" name="csrftoken_reply">') 
    matches = pattern.findall(str(response.read())) 
    for match in matches: 
     print match 

出力としてa7b161b7を取得しようとしています

+1

おそらく 'class =" token "の後に2つのスペースがあるので? –

+0

空白にはいくつかのエラーがあります。クラスと値の間に2つのスペースがあるということは本当に意味しましたか? – kojiro

+1

あなたがマッチさせたいと思うhtml文字列を投稿してください(その部分) – joaquin

答えて

0

Pythonの人ではなく、正規表現をHTMLを解析することを推奨していませんが、この方法で順序付けられていないatt-valデータを取得することは可能です。
タグを修飾するために必要なのは、
のペアをいくつか入れてください。それは必ずしもすべてである必要はありません。

モディファイア:拡張された単一行の文字列、グローバル。このフォームで怠惰な数量詞は、先読みを満たすためのマークアップboundriesをオーバーランすることを余儀なくされるため、
値のキャプチャグループは$ 5

編集
(?= (?:[^>"\']|(?>".*?"|\'.*?\'))*?(?= (?:".*?"|\'.*?\'|[^>]*?)+を変更しています。新しいサブ式は、オーバーランのないattr="so<m>e"埋め込みマークアップを処理します。

<input 
    (?=\s) 
    (?= (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) class \s*=\s* ([\'"]) \s* csrftoken \s*\1) 
    (?= (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) name \s*=\s* ([\'"]) \s* csrftoken_reply \s*\2) 
    (?= (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) type \s*=\s* ([\'"]) \s* hidden \s*\3) 
    (?= (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) value \s*=\s* ([\'"]) \s* (.*?) \s*\4) 
    \s+ (?:".*?"|\'.*?\'|[^>]*?)+ (?<!/) 
> 

すべての警告が適用され、埋め込まれたコードで隠されている可能性があります。コメントなど
余分な正規表現ロジックが必要です。

1

これは私のために解析する文字列の例を与える必要があります。

import re 

htmlstring = """ 
<input class="token" value="foo" name="csrftoken_reply"> 
""" 

pattern= re.compile(r'<input class="token" value="(.+?)" name="csrftoken_reply">') 
matches = pattern.findall(htmlstring) 
for match in matches: 
    print match 

これ以外にも、このような目的で設計されたライブラリを使用することを検討しましたか?正規表現はHTMLを解析するときには非常に壊れやすい可能性があります。 Beautiful Soupはこの仕事のための人気のあるツールのようです。

更新

あなたは間違ったクラス値、余分なスペースを持っている、とあなたは「= 『隠された』入力タイプ」を忘れてしまいました。私はまだこのための正規表現の使用を阻止するだろうけれどもここでは、近い何か:

r'<input class="csrftoken" type="hidden" value="(.+?)" name="csrftoken_reply">' 

これは同様に動作(私は1つ1「csrftoken_reply」要素があると仮定している):

r'value="(.+?)" name="csrftoken_reply">' 

これらの両方あなたの希望する価値を得るために私のために働く。

+0

追加情報... –

+0

ところで、私はhttp://regexpal.com/でテストしました。そこではうまく動作しているようです。何らかの理由でPythonを使用していません –

+0

@SynbitzProwduczions更新された回答を参照してください –

0

申し訳ありませんが、2011年に正規表現を使ってHTMLを解析するのは、境界線の狂気です:)このタスクに最適化されたライブラリの数は、上記のBeautifulSoupとlxmlです。私はあなたが依存関係と厄介なインストールのリストのためにlxmlに対処したくないことを理解できますが、BeautifulSoupはのファイルです。

TL; DR:あなたは車輪を再発明しています。