1

我使用 urllib2.urlopen 来获取此类网站的源代码。我读取了字节,并使用beautifulsoup 将代码标记为applet。此代码包括以下行:

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

我需要捕获代码中包含在带有tipo="macro"的值中的所有 "expresión=" 值(特别是dinamica/resortedinamica/masa)。

使用beautifulsoup,我将这些行识别为标签,只有带有tipo='macro'的标签,我想简短一些,现在我寻找expresión=的右侧 :

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 值,我不知道如何捕获这个标签,无论如何 re + search 似乎做得很好(......而右侧是:dinamica/resorte. 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

使用更复杂的正则表达式的更好的解决方案。(注意这里的 unicode 字符串。)

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 回答