Question

Je travaille sur quelque chose qui extrait les URL de délicieux et les utilise ensuite pour découvrir les flux associés.

Cependant, certains des signets dans delicious ne sont pas des liens html et font en sorte que BS se déchaîne. En gros, je veux jeter un lien si BS le récupère et que cela ne ressemble pas à du HTML.

Pour l'instant, voici ce que je comprends.

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:

La réponse de Jéhiah fait le tour. Pour référence, voici du code pour obtenir le type de contenu:

def check_for_html(link):
    out = urllib.urlopen(link)
    return out.info().getheader('Content-Type')
Était-ce utile?

La solution

J'emballe simplement mon traitement BeautifulSoup et recherche l'exception HTMLParser.HTMLParseError

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 vous pouvez également vérifier le type de contenu des réponses lorsque vous explorez une page et vous assurer qu'il correspond à 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top