2009-01-17 9 views
1

Je travaille sur quelque chose qui tire des URL de délicieux et utilise ensuite ces URL pour découvrir les aliments associés. Cependant, certains des signets dans delicious ne sont pas des liens html et provoquent BS à barf. Fondamentalement, je veux jeter un lien si BS le récupère et il ne ressemble pas à html.Quelle est la meilleure façon de gérer un mauvais lien donné à BeautifulSoup?

En ce moment, voici ce que je vais obtenir.

trillian:Documents jauderho$ ./d2o.py "green data center" 
processing http://www.greenm3.com/ 
processing http://www.eweek.com/c/a/Green-IT/How-to-Create-an-EnergyEfficient-Green-Data-Center/?kc=rss 
Traceback (most recent call last): 
    File "./d2o.py", line 53, in <module> 
    get_feed_links(d_links) 
    File "./d2o.py", line 43, in get_feed_links 
    soup = BeautifulSoup(html) 
    File "/Library/Python/2.5/site-packages/BeautifulSoup.py", line 1499, in __init__ 
    BeautifulStoneSoup.__init__(self, *args, **kwargs) 
    File "/Library/Python/2.5/site-packages/BeautifulSoup.py", line 1230, in __init__ 
    self._feed(isHTML=isHTML) 
    File "/Library/Python/2.5/site-packages/BeautifulSoup.py", line 1263, in _feed 
    self.builder.feed(markup) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/HTMLParser.py", line 108, in feed 
    self.goahead(0) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/HTMLParser.py", line 150, in goahead 
    k = self.parse_endtag(i) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/HTMLParser.py", line 314, in parse_endtag 
    self.error("bad end tag: %r" % (rawdata[i:j],)) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/HTMLParser.py", line 115, in error 
    raise HTMLParseError(message, self.getpos()) 
HTMLParser.HTMLParseError: bad end tag: u'</b />', at line 739, column 1 

Mise à jour:

réponse de Jechija fait l'affaire. Pour référence, voici un code pour obtenir le type de contenu:

def check_for_html(link): 
    out = urllib.urlopen(link) 
    return out.info().getheader('Content-Type') 

Répondre

3

je simplement envelopper mon traitement de BeautifulSoup et cherchez la HTMLParser.HTMLParseError exception

import HTMLParser,BeautifulSoup 
try: 
    soup = BeautifulSoup.BeautifulSoup(raw_html) 
    for a in soup.findAll('a'): 
     href = a.['href'] 
     .... 
except HTMLParser.HTMLParseError: 
    print "failed to parse",url 

, mais plus que cela, vous pouvez vérifier le type de contenu les réponses lorsque vous parcourez une page et assurez-vous que c'est quelque chose comme text/html ou application/xml+xhtml ou quelque chose comme ça avant même d'essayer de l'analyser. Cela devrait éviter la plupart des erreurs.