0

Web サイトから情報を取得する Web スパイダーを作成しています。このページhttp://www.tripadvisor.com/Hotels-g294265-oa120-Singapore-Hotels.html#ACCOM_OVERVIEWを解析する と、一部の情報が失われていることがわかり、soup.prettify() を使用して html ドキュメントを印刷します。 HTML ドキュメントは、urllib2.openurl() を使用して取得したドキュメントと同じではありません。何かが失われています。コードは次のとおりです。

    htmlDoc = urllib2.urlopen(sourceUrl).read()
    soup = BeautifulSoup(htmlDoc)

    subHotelUrlTags = soup.findAll(name='a', attrs={'class' : 'property_title'})
    print len(subHotelUrlTags)
    #if len(subHotelUrlTags) != 30:
    #   print soup.prettify()
    for hotelUrlTag in subHotelUrlTags:
        hotelUrls.append(website + hotelUrlTag['href'])

HtmlParser を使用して同じことをしようとすると、次のエラーが出力されます。

 Traceback (most recent call last):
 File "./spider_new.py", line 47, in <module>
 hotelUrls = getHotelUrls()
 File "./spider_new.py", line 40, in getHotelUrls
 hotelParser.close()
 File "/usr/lib/python2.6/HTMLParser.py", line 112, in close
 self.goahead(1)
 File "/usr/lib/python2.6/HTMLParser.py", line 164, in goahead
 self.error("EOF in middle of construct")
 File "/usr/lib/python2.6/HTMLParser.py", line 115, in error
 raise HTMLParseError(message, self.getpos())
 HTMLParser.HTMLParseError: EOF in middle of construct, at line 3286, column 1
4

1 に答える 1

1

lxmlをダウンロードしてインストールします。

このような「欠陥のある」Web ページを解析できます。(HTML はおそらく何らかの奇妙な方法で壊れており、Python の HTML パーサーは、bs4 の助けを借りても、そのようなことを理解するのが得意ではありません。)

また、lxml をインストールする場合、コードを変更する必要はありません。BeautifulSoup は自動的に lxml を取得し、代わりにそれを使用して HTML を解析します。

于 2013-05-07T03:49:46.987 に答える