私は自分の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に精通していないので、私に同行してください
唯一の問題が 'print'でなければ、印刷行に' encode'を行うことができます。 – wRAR
これは基本的に 'print(soup.get_text()。encode( 'utf-8')')ですか? – bholagabbar
はい、どうしてですか? 'soup'オブジェクトを置き換えるだけで印刷することができます。 – wRAR