2016-11-20 4 views
0

私は美しいスープと、このサイトのテキストをプリントアウトしようとしてきたのエンコーディングを把握することはできません:サイトはちんぷんかんぷんと奇妙なキャラクターや他のパーサを返し解析するlxmlを使用し http://www3.forbes.com/entrepreneurs/25-most-expensive-schools-worth-every-penny/26/は美しいスープオブジェクト

wouldn何も返さない。私は、サイト<meta charset="UTF-8">と一致するUTF-8としてエンコーディングを指定しようとしましたが、運がなかった。使用する正しいパーサーは何でしょうか、どのように実装しますか?私はBeautiful Soupの初心者で、シンプルで分かりやすい説明を本当に感謝しています。ありがとう!

from bs4 import BeautifulSoup 
import urllib.request 

URL = urllib.request.urlopen("http://www3.forbes.com/entrepreneurs/25-most-expensive-schools-worth-every-penny").read() 
soup = BeautifulSoup(URL,'xml') 

print(soup.text) 

答えて

2

あなたが見ているのではないので、BeautifulSoupや文字列のエンコーディングのちんぷんかんぷんが、理由はurllibは、サーバーの内容 -encodingの。

コンテンツエンコード:デフォルトでは、通常のgzip

URLをretrieveingときにサーバーに送信されたが受け入れ-encodingをヘッダが空のままの場合は、サーバーからresponeヘッダには、これを含めますサーバーはではなく、のコンテンツを圧縮する必要があります。しかし何らかの理由で、アクセスしているサーバーはこれを気にせず、gzipped aynwayを送信します。 (それはpossbileです)あなたはもちろん、自分でのpythonとgzipで圧縮された応答を解凍しようとすることができます

URL = urllib.request.Request("http://www3.forbes.com/entrepreneurs/25-most-expensive-schools-worth-every-penny") 
URL.add_header('accept-encoding','identity') 
resp = urllib.request.urlopen(URL) 

が、ここにあなたの最良のオプションは、いくつかの他のライブラリを使用することです:ヘッダは、明示的にこのよう'Accept-encoding': 'identity'に設定されている場合でも、 (可能であれば)requestsのように、URLを取得するためのURLです(できる場合)。あなたは、コマンドラインからのピップでrequestsをインストールすることができます。

pip3 install requests 

そして、あなたのコードでURLを取得:しかし出力することで、いくつかのJavaScriptコードを、ないサイトからのテキストだけでしょう

import requests 

URL = requests.get("http://www3.forbes.com/entrepreneurs/25-most-expensive-schools-worth-every-penny/26/") 
soup = BeautifulSoup(URL.text,'lxml') 

print(soup.text) 

を。

あなたはです。でも、他の答えが示唆するように、セレンを使用します。しかし、セレンは、サイトで実際にjavascriptを実行する必要がある場合や、ブラウザを使用する場合と同じようにインタラクティブに操作する必要がある場合に、より多くのことを意味します。したがって、静的テキストを取得する必要がある場合は、urllibまたは要求を使用してより軽量にします。

+1

この素晴らしい、洞察力のある答えに加えて、OAはドキュメント、https://docs.python.org/3.4/howto/urllib2.htmlに興味があるかもしれません。 –

0

正解を一切見つけずに美しいスープでエンコーディングを理解しようと1年半かかりました。 セレンとセレニウムの発見時にこのライブラリを削除しました。

from selenium import webdriver 
driver = webdriver.Chrome() 
driver.get(url) 
driver.find_element_by_id("<tag id>") 

それはちょうど喜びです:http://www.seleniumhq.org/projects/webdriver/