BeautifulSoup에 주어진 나쁜 링크를 처리하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/452884

  •  19-08-2019
  •  | 
  •  

문제

나는 Delicious에서 URL을 끌어 당기고 URL을 사용하여 관련 피드를 발견하는 작업을 수행하고 있습니다.

그러나 Delicious의 북마크 중 일부는 HTML 링크가 아니며 BS가 Barf를 유발합니다. 기본적으로 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')
도움이 되었습니까?

해결책

나는 단순히 내 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 또는 당신이 그것을 구문 분석하기 전에 그런 것. 그것은 대부분의 오류를 벗어나야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top