Quel est le meilleur moyen de gérer un mauvais lien attribué à BeautifulSoup?
-
19-08-2019 - |
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')
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.