2009-09-29 7 views
7

J'ai mis en place une liste de pages que nous devons mettre à jour avec du nouveau contenu (nous changeons de formats de média). Dans le processus, je catalogue des pages qui ont correctement le nouveau contenu.Python Regex "l'objet n'a aucun attribut"

est ici l'idée générale de ce que je fais:

  1. Itérer à travers une structure de fichier et obtenir une liste des fichiers
  2. Pour chaque fichier lu dans une mémoire tampon et, en utilisant la recherche regex, correspondre à une balise spécifique
  3. Si adapté, le test 2 correspond plus regex
  4. écrire les résultats obtenus (un ou l'autre) dans une base de données

Tout fonctionne bien jusqu'à la 3e match de modèle regex, où je reçois le texte suivant:

'NoneType' object has no attribute 'group'

# only interested in embeded content 
pattern = "(<embed .*?</embed>)" 

# matches content pointing to our old root 
pattern2 = 'data="(http://.*?/media/.*?")' 

# matches content pointing to our new root 
pattern3 = 'data="(http://.*?/content/.*?")' 

matches = re.findall(pattern, filebuffer) 
for match in matches: 
    if len(match) > 0: 

    urla = re.search(pattern2, match) 
    if urla.group(1) is not None: 
     print filename, urla.group(1) 

    urlb = re.search(pattern3, match) 
    if urlb.group(1) is not None: 
     print filename, urlb.group(1) 

merci.

Répondre

16

Votre exception signifie que l'URL a la valeur Aucun. Puisque la valeur d'urla est déterminée par l'appel re.search, il en résulte que re.search renvoie None. Et cela arrive quand la chaîne ne correspond pas au modèle.

Donc, fondamentalement, vous devez utiliser:

urla = re.search(pattern2, match) 
if urla is not None: 
    print filename, urla.group(1) 

au lieu de ce que vous avez maintenant.

2

La raison est que TypeErrorsearch ou match retournent généralement soit un MatchObject ou None. Un seul d'entre eux a une méthode group. Et ce n'est pas un None. Donc, vous devez faire:

url = re.search(pattern2, match) 
if url is not None: 
    print(filename, url.group(0)) 

post-scriptumPEP-8 suggère d'utiliser 4 espaces pour l'indentation. Ce n'est pas seulement une opinion, c'est une bonne pratique. Votre code est assez difficile à lire.

+0

ah. Je vous remercie. J'utilise des onglets dans le code, qui ont été reformatés/réinterprétés par le moteur de formatage pour ce site. "url n'est pas fixe" – ives

0

Veuillez également noter votre hypothèse erronée que l'erreur était dans le troisième match, quand il était en fait dans la seconde. Cela semble avoir conduit à l'hypothèse erronée que le deuxième match faisait quelque chose pour invalider le troisième, vous envoyant loin de la piste.

2

J'ai eu le même problème.

En utilisant python2.6, vous pouvez résoudre de cette manière:

 
for match in matches: 
if len(match) > 0: 

    urla = re.search(pattern2, match) 
    try: 
    urla.group(1): 
    print filename, urla.group(1) 
    excpet: 
    print "Problem with",pattern2 


    urlb = re.search(pattern3, match) 
    try: 
    urlb.group(1) 
    print filename, urlb.group(1) 
    except: 
    print "Problem with",pattern3 
+0

Petite faute de frappe: sauf: au lieu de "excpet:" pour bloc urla. –

Questions connexes