2016-09-21 3 views
1

моего кода:питона - BeautifulSoup find_all(), в результате неверной даты

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()) 

Данный код выведет "Invalid даты". Как получить дату?

Дополнительное примечание:

Кажется, решение использует селен или 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

Это очень просто, если вы используете Selenium. Вот простой пример с некоторыми пояснениями:

Для установки селеном выполнения 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

Смежные вопросы