2016-09-21 27 views
1

私のコードを結果beautifulsoupのfind_all():のpython - 無効な日付に

import requests 
import re 
from bs4 import BeautifulSoup 

r = requests.get(
    "https://www.traveloka.com/hotel/detail?spec=22-9-2016.24-9-2016.2.1.HOTEL.3000010016588.&nc=1474427752464") 

data = r.content 
soup = BeautifulSoup(data, "html.parser") 
ratingdates = soup.find_all("div", {"class": "reviewDate"}) 

for i in range(0,10): 
    print(ratingdates[i].get_text()) 

これらのコードは、 "無効な日付" を表示します。どのように日付を取得するには?

追加注:

解決策がセレンまたはspynnerを使用しているが、私はそれを使用する方法がわからないようです。また、私はspynnerをインストールすることはできません、それは常にあなたがセレンを使用する場合、それは本当に簡単ですlxmlの

+0

日付は、AJAXリクエストを介して生成され、データがhttps://api.traveloka.com/v1/hotel/hotelReviewAggregateに掲載され、非自明を複製することが可能です。 –

+0

@PadraicCunninghamはあなたが私が見る私の[新しい質問](http://stackoverflow.com/questions/39703021/python-requests-fetch-data-from-api-based-website) –

答えて

1

をインストールする上で立ち往生。ここではいくつかの説明と基本的な例です:

セレン実行セレンを使用する方法の詳細についてはpip install selenium

from bs4 import BeautifulSoup 
from selenium import webdriver 

# set webdriver's browser to Firefox 
driver = webdriver.Firefox() 

#load page in browser 
driver.get(
    "https://www.traveloka.com/hotel/detail?spec=22-9-2016.24-9-2016.2.1.HOTEL.3000010016588.&nc=1474427752464") 

#Wait 5 seconds after page load so dates are loaded 
driver.implicitly_wait(5) 
#get page's source 
data = driver.page_source 

#rest is pretty much the same 
soup = BeautifulSoup(data, "html.parser") 
ratingdates = soup.find_all("div", {"class": "reviewDate"}) 

#I changed this bit to always print all dates without range issues 
for i in ratingdates: 
    print(i.get_text()) 

がここにドキュメントを見てインストールするには - http://selenium-python.readthedocs.io/

を、あなたが取得したくない場合スクリプトを実行するたびにFirefoxがポップアップするので、軽量ヘッダレスブラウザPhantomJSを使用できます。 downloadingの後に設定すると、上記の例ではdriver = webdriver.Firefox()driver = webdriver.PhantomJS()に変更できます。

+0

をチェックしていただけません、それは、ブラウザを必要とします私はブラウザなしでそれを行うことはできますか? –

+0

ページの 'js'を実行したいコンテンツが必要です。だからあなたはブラウザが必要です。しかし、毎回新しいウィンドウを開くことなく、それを行うオプションがあります。それはPhantomJSと呼ばれ、私は答えの最後にそれを少し追加しました。 – 4140tm