2011-03-08 12 views
0
>>> soup = BeautifulSoup(data) 
    Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
     File "/usr/lib/pymodules/python2.6/BeautifulSoup.py", line 1499, in __init__ 
     BeautifulStoneSoup.__init__(self, *args, **kwargs) 
     File "/usr/lib/pymodules/python2.6/BeautifulSoup.py", line 1230, in __init__ 
     self._feed(isHTML=isHTML) 
     File "/usr/lib/pymodules/python2.6/BeautifulSoup.py", line 1263, in _feed 
     self.builder.feed(markup) 
     File "/usr/lib/python2.6/HTMLParser.py", line 108, in feed 
     self.goahead(0) 
     File "/usr/lib/python2.6/HTMLParser.py", line 148, in goahead 
     k = self.parse_starttag(i) 
     File "/usr/lib/python2.6/HTMLParser.py", line 226, in parse_starttag 
     endpos = self.check_for_whole_start_tag(i) 
     File "/usr/lib/python2.6/HTMLParser.py", line 301, in check_for_whole_start_tag 
     self.error("malformed start tag") 
     File "/usr/lib/python2.6/HTMLParser.py", line 115, in error 
     raise HTMLParseError(message, self.getpos()) 
    HTMLParser.HTMLParseError: malformed start tag, at line 5518, column 822 



>>> for each in l[5515:5520]: 
...  print each 
... 
<script> 

    registerImage("original_image", "http://ecx.images-amazon.com/images/I/41h7uHc1jmL._SL500_AA240_.jpg","<a href="+'"'+"http://rads.stackoverflow.com/amzn/click/1592406017"+'"'+" target="+'"'+"AmazonHelp"+'"'+" onclick="+'"'+"return amz_js_PopWin(this.href,'AmazonHelp','width=700,height=600,resizable=1,scrollbars=1,toolbar=0,status=1');"+'"'+" ><img onload="+'"'+"if (typeof uet == 'function') { uet('af'); }"+'"'+" src="+'"'+"http://ecx.images-amazon.com/images/I/41h7uHc1jmL._SL500_AA240_.jpg"+'"'+" id="+'"'+"prodImage"+'"'+" width="+'"'+"240"+'"'+" height="+'"'+"240"+'"'+" border="+'"'+"0"+'"'+" alt="+'"'+"Life, on the Line: A Chef's Story of Chasing Greatness, Facing Death, and Redefining the Way We Eat"+'"'+" onmouseover="+'"'+""+'"'+" /></a>", "<br /><a href="+'"'+"http://rads.stackoverflow.com/amzn/click/1592406017"+'"'+" target="+'"'+"AmazonHelp"+'"'+" onclick="+'"'+"return amz_js_PopWin(this.href,'AmazonHelp','width=700,height=600,resizable=1,scrollbars=1,toolbar=0,status=1');"+'"'+" >See larger image</a>", ""); 
    var ivStrings = new Object(); 
</script> 
>>> 
>>> l[5518-1][822] 
'h' 
>>> 

注:Ubuntuの10.04美しいスープ不正な形式の開始タグのエラー

でPython 2.6.5を使用して、スクリプトタグを無視することになってBeutifulSoupませんか?
は、このうち方法を考え出すカント:(
任意の提案を??

+0

すべてのスクリプトタグを削除することもできます。 re.subと運がなかった、htmlが普通のlangではないので、htmlには使えないことを後で知るために:X – Nullpoet

答えて

2

PyparsingがちょうどまっすぐREさんよりも、より堅牢なスクリプトになり、いくつかのHTMLタグをサポートしています。そして、それは/プロセスを解析しようとしないので、全体のHTML本体ではなく、単なる文字列表現の照合に、それがひどく形成されたHTMLを処理することができますになります。

html = """<script>  
registerImage("original_image", 
"this is a closing </script> tag in quotes" 
etc.... 
</script> 
""" 

# code to strip <script> tags from an HTML page 
from pyparsing import makeHTMLTags,SkipTo,quotedString 

script,scriptEnd = makeHTMLTags("script") 
scriptBody = script + SkipTo(scriptEnd, ignore=quotedString) + scriptEnd 

descriptedHtml = scriptBody.suppress().transformString(html) 

あなたがやろうとしているスクレイピングHTMLの種類に応じて、あなたが使用して全体のことを行うことができるかもしれませんpyparsing。

0

私がBeautifulSoupでスクリプトタグを打つと、スープオブジェクトを文字列に変換し直し、問題のあるデータを削除してからデータを再スープします。あなたがデータを気にしないときに動作します。

関連する問題