Каков наилучший способ справиться с неверной ссылкой на BeautifulSoup? - PullRequest
1 голос
/ 17 января 2009

Я работаю над чем-то, что извлекает из восхитительных URL-адресов, а затем использует эти URL-адреса для обнаружения связанных каналов.

Однако, некоторые из восхитительных закладок не являются ссылками в формате html и приводят к тому, что BS перестает работать. По сути, я хочу выбросить ссылку, если BS получает ее, и она не выглядит как HTML.

Прямо сейчас, это то, что я получаю.

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

Обновление:

Ответ Джехии делает свое дело. Для справки вот код для получения типа контента:

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

1 Ответ

3 голосов
/ 17 января 2009

Я просто оборачиваю свою обработку BeautifulSoup и ищу исключение 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

но, кроме того, вы можете проверить тип содержимого ответов при сканировании страницы и убедиться, что это что-то вроде text/html или application/xml+xhtml или что-то в этом роде, прежде чем пытаться его проанализировать. Это должно предотвратить большинство ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...