2016-07-25 14 views
1

例としてURL https://www.google.cl/#q=stackoverflowを使用しましょう。私はこのコードを実行する場合pythonとウェブブラウザで同じリンクのコードが異なるのはなぜですか?

inspecting google search first result

今、::私たちは、このhtmlコードを参照してください検索によって与えられた最初のリンクでChromeデベロッパーツールを使用して

from urllib.request import urlopen 
from bs4 import BeautifulSoup 

url = urlopen("https://www.google.cl/#q=stackoverflow") 
soup = BeautifulSoup(url) 
print(soup.prettify()) 

を私は同じ要素を見つける文句を言いません。実際には、Google検索で得られた結果からリンクを見つけることはできません。 requestsモジュールを使用する場合も同様です。なぜこれが起こるのですか?ウェブブラウザからリクエストしているのと同じ結果を得るために何かできますか?

+2

動的に読み込まれるページです。 –

+0

@MoonCheesezは、Chromeのような真のHTMLコードを取得する方法はありますか? –

答えて

2

AngularやReactのような現代的な単一ページのJavaScriptフレームワーク(あるいは単なるJavaScriptでも可能です)からhtmlが動的に生成されるため、domを解析する前にセレンまたはファントムを使用してブラウザを実際にサイトに移動する必要があります。

ここにいくつかのスケルトンコードがあります。ここで

from selenium import webdriver 
from bs4 import BeautifulSoup 

driver = webdriver.Chrome() 
driver.get("http://google.com") 

html = driver.execute_script("return document.documentElement.innerHTML") 
soup = BeautifulSoup(html) 

は、セレンを実行している詳細はセレンのドキュメントで構成、等:

http://selenium-python.readthedocs.io/

編集: あなたは可能性があるため、HTMLをつかむ前にwaitを追加する必要がありますページの特定の要素を読み込むのに2分の1かかります。 Pythonのセレンの明示的待ちのドキュメントを参照するために、以下を参照してください:合併症の

http://selenium-python.readthedocs.io/waits.html

もう一つのソースは、ページの特定の部分は、ユーザーとの対話の後まで隠されるかもしれないということです。この場合、htmlを取得する前に、特定の方法でページとやりとりするためにセレンスクリプトをコーディングする必要があります。

関連する問題