1

urllib2.urlopen を使用して、このようなサイトのソース コードを取得します。バイトを読み取り、beautifulsoup を使用してアプレットとラベル付けされたコードを取得します。このコードには次の行が含まれます。

<param name="G_00" value="espacio='E1' tipo='macro' expresi&oacute;n='dinamica/resorte'">

コード内のすべての "expresión=" 値を、tipo="macro" (具体的にはdinamica/resorteおよびdinamica/masa ) の値に含まれているものとしてキャプチャする必要があります。

beautifulsoup では、これらの種類の行をタグとして識別します。tipo='macro' のタグのみです。簡潔にしたいので、式 = の右側を探します

key_macro = ['expresión=', 'expresion=', 'expresi&oacute;n='....] # yes, a problem, it could be this way
for y in key_macro:
    if string.find(tag, y) != -1:
        # sometimes -sorry- macros are in txt format: 
        mexpression = r"%s'([\w\./]+)'" % y
        mpatron = re.compile(mexpression)
        mresult = mpatron.search(tag['value'])
        if mresult: # 1
            macroslist.append(mresult.group(1))
        # sometimes without extension
        wexpression = r"%s'([\w/]+)'" % y
        wpatron = re.compile(wexpression)
        wresult = wpatron.search(tag['value'])
        if wresult: # 2
            macroslist.append(wresult.group())

問題:#1で.txtファイルが存在する場合は取得します-保証できます-しかし#2で(単語/単語を探します)dinamica/resorteとして何かが見つかりません.wresultは常に失敗し、必要ですこれらの値をキャプチャします。

私の正規表現は悪いですか?すべての問題は、単語/単語を正規表現で示す方法ですか?

私はbeautifulsoupで検索を試みましたが、「macro」はINSIDE値であり、このタグをキャプチャする方法がわかりません。 txt の場合、 # 1 は機能します) が、拡張子なしでは機能しません。

御時間ありがとうございます。

4

1 に答える 1

0

力ずくで愚かな解決策で申し訳ありませんが、検索するすべてのキーに関して、ニーズをより適切に指定する必要があります。私は個人的に解決策が良いとは考えていません。とにかく、試してください:

import re

def brute_force_and_stupid(s, rex=re.compile(r"expresion='([a-zA-Z./]+)'")):
    s = s.replace('&oacute;', 'o')
    s = s.replace('ó', 'o')
    print s
    m = rex.search(s)
    if m:
        return m.group(1)
    return None

tag = "<param name=\"G_00\" value=\"espacio='E1' tipo='macro' expresi&oacute;n='dinamica/resorte'\">"
print tag
print brute_force_and_stupid(tag)

それは私のコンソールに印刷されます:

c:\tmp\___python\Antonio\so10295276>python a.py
<param name="G_00" value="espacio='E1' tipo='macro' expresi&oacute;n='dinamica/resorte'">
<param name="G_00" value="espacio='E1' tipo='macro' expresion='dinamica/resorte'">
dinamica/resorte

より複雑な正規表現を使用した、わ​​ずかに優れたソリューション。(ここのユニコード文字列に注意してください。)

import re

rex = re.compile(ur"expresi(o|ó|&oacute;)n='(?P<text>[a-zA-Z./]+)'")

tag = u"<param name=\"G_00\" value=\"espacio='E1' tipo='macro' expresi&oacute;n='dinamica/resorte'\">"
print tag

m = rex.search(tag)
if m:
    print m.group('text')
else:
    print None    

それは印刷します:

c:\tmp\___python\Antonio\so10295276>python b.py
<param name="G_00" value="espacio='E1' tipo='macro' expresi&oacute;n='dinamica/resorte'">
dinamica/resorte
于 2012-04-24T14:33:32.553 に答える