2012-07-24 3 views
0

J'ai une URL que je veux analyser une partie, en particulier le widgetid:Comment exécuter une valeur d'attribut à travers une expression régulière après l'extraction via BeautifulSoup?

<a href="http://www.somesite.com/process.asp?widgetid=4530">Widgets Rock!</a> 

Je l'ai écrit Python (je suis un peu d'un débutant à Python - version 2.7):

import re 
from bs4 import BeautifulSoup 

doc = open('c:\Python27\some_xml_file.txt') 
soup = BeautifulSoup(doc) 


links = soup.findAll('a') 

# debugging statements 

print type(links[7]) 
# output: <class 'bs4.element.Tag'> 

print links[7] 
# output: <a href="http://www.somesite.com/process.asp?widgetid=4530">Widgets Rock!</a> 

theURL = links[7].attrs['href'] 
print theURL 
# output: http://www.somesite.com/process.asp?widgetid=4530 

print type(theURL) 
# output: <type 'unicode'> 

is_widget_url = re.compile('[0-9]') 
print is_widget_url.match(theURL) 
# output: None (I know this isn't the correct regex but I'd think it 
#   would match if there's any number in there!) 

Je pense que je manque quelque chose avec l'expression régulière (ou ma compréhension de la façon de les utiliser) mais je ne peux pas le comprendre.

Merci pour votre aide!

+0

La raison 'urlparse' qui est suggéré est qu'il a déjà la logique de l'analyse syntaxique chaîne de requête élaborée - Par exemple, si vous obtenez une URL avec plus de paramètres, cela fonctionnera toujours. – katrielalex

Répondre

5

Cette question n'a rien à voir avec BeautifulSoup.

Le problème est que, comme the documentation explains, match correspond seulement au début de la chaîne. Puisque les chiffres que vous voulez trouver sont à la fin de la chaîne, il ne retourne rien.

Pour correspondre à un chiffre quelconque, utilisez search - et vous voulez probablement utiliser l'entité \d pour les chiffres.

matches = re.search(r'\d+', theURL) 
+0

Merci beaucoup. Cela m'a bloqué pendant un bon moment! – John

+0

N'utilisez pas 're' pour cela, utilisez' urlparse'. –

+0

@Tichodrome, est-ce à cause de l'efficacité (en utilisant urlparse plutôt que regex)? – John

2

Utilisation urlparse:

from urlparse import urlparse, parse_qs 
o = urlparse("http://www.somesite.com/process.asp?widgetid=4530") 
if "widgetId" in parse_qs(o.query): 
    # this is a 'widget URL' 
+0

Merci pour les informations sur urlparse. – John

4

Je ne pense pas que vous voulez un re - il est possible que vous voulez:

from urlparse import urlparse, parse_qs 
s = 'http://www.somesite.com/process.asp?widgetid=4530' 
qs = parse_qs(urlparse(s).query) 
if 'widgetid' in qs: 
    # it's got a widget, a widget it has got... 
+0

Merci pour cela. Je suppose que regex est mon marteau de parsing préféré. – John

Questions connexes