문제

BeautifulSoup과 함께 HTML 페이지를 구문 분석하려고하지만 BeautifulSoup은 HTML이나 해당 페이지를 전혀 좋아하지 않는 것 같습니다. 아래 코드를 실행하면 method prettify ()가 페이지의 스크립트 블록 만 반환합니다 (아래 참조). 왜 그런 일이 발생하는지 생각이 있습니까?

import urllib2
from BeautifulSoup import BeautifulSoup

url = "http://www.futureshop.ca/catalog/subclass.asp?catid=10607&mfr=&logon=&langid=FR&sort=0&page=1"
html = "".join(urllib2.urlopen(url).readlines())
print "-- HTML ------------------------------------------"
print html
print "-- BeautifulSoup ---------------------------------"
print BeautifulSoup(html).prettify()

BeautifulSoup이 생성 한 출력입니다.

-- BeautifulSoup ---------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script language="JavaScript">
 <!--
     function highlight(img) {
       document[img].src = "/marketing/sony/images/en/" + img + "_on.gif";
     }

     function unhighlight(img) {
       document[img].src = "/marketing/sony/images/en/" + img + "_off.gif";
     }
//-->
</script>

감사!

업데이트 : 다음 버전을 사용하고 있습니다.이 버전은 최신 인 것으로 보입니다.

__author__ = "Leonard Richardson (leonardr@segfault.org)"
__version__ = "3.1.0.1"
__copyright__ = "Copyright (c) 2004-2009 Leonard Richardson"
__license__ = "New-style BSD"
도움이 되었습니까?

해결책

버전 3.0.7a로 시도하십시오 우쿠 카스 제안. BeautifulSoup 3.1은 Python 3.0과 호환되도록 설계되었으므로 Parser를 SGMLPARSER에서 HTMLPARSER로 변경 해야하는 HTML에 더 취약해 보입니다.

로부터 BeautifulSoup 3.1의 Changelog:

"아름다운 수프는 이제 파이썬 3에 사라진 SGMLPARSER 대신 HTMLPARSER를 기반으로합니다.

다른 팁

노력하다 LXML. 그 이름에도 불구하고, 그것은 또한 HTML을 구문 분석하고 긁는 것입니다. BeautifulSoup보다 훨씬 빠르며 BeautifulSoup보다 "부러진"HTML을 더 잘 처리하므로 더 잘 작동 할 수 있습니다. LXML API를 배우고 싶지 않다면 BeautifulSoup의 호환 API도 있습니다.

Ian Blicking은 동의합니다.

Google App Engine에 있거나 순전히 Python이 허용되지 않는 경우 더 이상 BeautifulSoup을 사용할 이유가 없습니다.

BeautifulSoup은 마술이 아닙니다 : 들어오는 HTML이 너무 끔찍하다면 작동하지 않을 것입니다.

이 경우, 들어오는 HTML은 정확히 그 것입니다. BeautifulSoup이 무엇을 해야하는지 알아 내기에는 너무 깨졌습니다. 예를 들어 : 마크 업이 포함되어 있습니다.

스크립트 유형 = ""JavaScript ""

(이중 견적을 주목하십시오.)

BeautifulSoup Docs에는 BeautifulSoup이 마크 업을 구문 분석 할 수없는 경우 할 수있는 섹션이 포함되어 있습니다. 이러한 대안을 조사해야합니다.

Samj : 내가 좋아하는 경우HTMLParser.HTMLParseError: bad end tag: u"</scr' + 'ipt>"나는 BeautifulSoup에 봉사하기 전에 Markup에서 범인을 제거하고 모든 것은 dandy입니다.

html = urllib2.urlopen(url).read()
html = html.replace("</scr' + 'ipt>","")
soup = BeautifulSoup(html)

다음 코드도 파싱하는 데 문제가있었습니다.

<script>
        function show_ads() {
          document.write("<div><sc"+"ript type='text/javascript'src='http://pagead2.googlesyndication.com/pagead/show_ads.js'></scr"+"ipt></div>");
        }
</script>

htmlparseerror : 잘못된 끝 태그 : u '', 26 행, 열 127

BeautifulSoup 버전 '3.0.7a'에서이 스크립트를 테스트했으며 올바른 출력으로 보이는 것을 반환합니다. 나는 '3.0.7a'와 '3.1.0.1'사이에 무엇이 바뀌 었는지 모르겠지만 시도해보십시오.

import urllib
from BeautifulSoup import BeautifulSoup

>>> page = urllib.urlopen('http://www.futureshop.ca/catalog/subclass.asp?catid=10607&mfr=&logon=&langid=FR&sort=0&page=1')
>>> soup = BeautifulSoup(page)
>>> soup.prettify()

필자의 경우 위의 진술을 실행하여 전체 HTML 페이지를 반환합니다.

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