2016-03-27 11 views
0

私は自分のWebスクレーパーをPythonで構築しようとしています。ステップの1つは、ほとんどのチュートリアルで推奨されているパーサーであるBeautifulSoupを使用しているHTMLページの解析です。ここでページを抽出し、それを印刷しなければならない私のコードです:'str'型キャストによるutf-8変換後のBeautifulSoupオブジェクトからデータを抽出できません

import urllib 
from bs4 import BeautifulSoup 

urlToRead = "http://www.randomjoke.com/topic/haha.php" 
handle = urllib.urlopen(urlToRead) 
htmlGunk = handle.read() 
soup = BeautifulSoup(htmlGunk, "html.parser") 
soup = soup.prettify() 
print (soup) 

は、しかし、私はsoup.prettify()を行うと、それを印刷するときにエラーがあるようです。エラーは次のとおりです。

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in position 16052: ordinal not in range(128)

これを解決するために、私はさらにGoogleで検索し、それを解決SOのthis答えに出くわしました。私は基本的にエンコードを'utf=8'に設定しなければなりませんでした。したがって、改造されたコードは次のとおりです(最後の2行のみ):

soup = soup.prettify().encode('utf-8') 
print (soup) 

これはうまくいきます。問題は、hereのチュートリアルで述べたようにsoup.get_text()メソッドを使用しようとすると発生します。私はsoup.get_text()を行うたびに、私はエラーを取得する:

AttributeError: 'str' object has no attribute 'get_text'

私は「UTF-8」にスープをコードすることだし、それはstrにそれを変更することですので、これは期待されていると思います。 type(soup)の前後にutf-8の変換を行いましたが、変換前はbs4.BeautifulSoupクラスのオブジェクトであり、その後はstrでした。

どうすれば対処できますか?私は何か間違っていると確信しています、そして、これを回避するには適切な方法があります。残念ながら、私はあまりにもPythonに精通していないので、私に同行してください

+0

唯一の問題が 'print'でなければ、印刷行に' encode'を行うことができます。 – wRAR

+0

これは基本的に 'print(soup.get_text()。encode( 'utf-8')')ですか? – bholagabbar

+0

はい、どうしてですか? 'soup'オブジェクトを置き換えるだけで印刷することができます。 – wRAR

答えて

1

オリジナルのsoupオブジェクトを破棄してはいけません。印刷する必要がある場合はsoup.prettify().encode('utf-8')に電話をかけることができます(または別の変数に保存する)。

1
import urllib 
from bs4 import BeautifulSoup 

urlToRead = "http://www.randomjoke.com/topic/haha.php" 
handle = urllib.urlopen(urlToRead) 
htmlGunk = handle.read() 
soup = BeautifulSoup(htmlGunk, "html.parser") 
html_code = soup.prettify().encode('utf-8') 
text = soup.get_text().encode('utf-8') 

print html_code 
print "#################" 
print text 



# a = soup.find() 
# l = [] 
# for i in a.next_elements: 
#  l.append(i) 
関連する問題