2012-04-24 23 views
1

我使用urllib2.urlopen获取网站的源代码,如this。 我读的字节,我得到的代码标签为使用美丽的小程序。 此代码包含线为:beautifulsoup vs re和regext搜索

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

我需要捕获所有的“expresión=”值中包含的值与TIPO =“宏”dinamica/resortedinamica代码/ masa)。

随着beautifulsoup我确定这几样行作为标签,才用TIPO =“宏观”很好,我想简单地说,现在我找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进行搜索,但'宏'是INSIDE值,我不知道如何捕获这个标签,无论如何,重新搜索似乎做得很好(...而右侧是:例如dinamica/resorte.txt,然后#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 
+0

JA !,第二个想法(寻找(P [a-zA-Z./]+)转换为Unicode?赞助人和标签以前似乎完美地工作!对不起,我的不好的解释,并感谢你的努力进行。是的,正则表达式头痛。 – Antonio 2012-04-24 16:34:40