2016-01-11 2 views
2

Я пытаюсь написать программу, которая извлекает цены на нижеуказанный веб-сайт. Я загружаю сайт с селеном, а затем пытаюсь разобрать его либо с помощью beautifulsoup, либо с самим селеном.BeautifulSoup не находит элементы

Я определил, что информация, которую я хочу, всегда является классом = «totalPrice», и я хотел бы извлечь их все, в идеале в виде списка.

<td class="totalPrice" colspan="3"> 
Total: £560 
<span class="sr_room_reinforcement"></span> 
</td> 

По какой-то причине нижеприведенные запросы никогда не обнаруживают никакой общей цены. Любые предложения о том, что я делаю неправильно, будут оценены.

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from bs4 import BeautifulSoup as bs 

url='http://www.booking.com/searchresults.en-gb.html?label=gen173nr-17CAEoggJCAlhYSDNiBW5vcmVmaFCIAQGYAS64AQTIAQTYAQHoAQH4AQs;sid=1a43e0952558ac0ad0061d5b6523a7bc;dcid=1;checkin_monthday=4;checkin_year_month=2016-2;checkout_monthday=11;checkout_year_month=2016-2;city=-2601889;class_interval=1;csflt=%7B%7D;group_adults=7;group_children=0;highlighted_hotels=1192837;hp_sbox=1;label_click=undef;no_rooms=1;review_score_group=empty;room1=A%2CA%2CA%2CA%2CA%2CA%2CA;sb_price_type=total;score_min=0;si=ai%2Cco%2Cci%2Cre%2Cdi;ss=London;ssafas=1;ssb=empty;ssne=London;ssne_untouched=London&;order=price_for_two' 
driver = webdriver.PhantomJS(r"C:\\Program Files (x86)\\phantomjs-2.0.0-windows\\bin\\phantomjs.exe") 
#driver = webdriver.Firefox() 
driver.get(url) 

# for elm in driver.find_element_by_class_name("totalPrice"): 
#  print(elm.text) 

content = driver.page_source 
soup = bs(content, 'lxml') 
for e in soup.find_all('totalPrice'): 
    print(e.name) 

driver.close() 

ответ

3

Прежде всего, вам нужно ждать, когда общие цены будут загружены. Используйте WebDriverWait класс с precense_of_element_located Ожидаемое состояние.

Я также обнаружил, что вам нужно будет не претендует на PhantomJS Переопределяя браузера User-Agent через Желаемая возможностей.

Полный рабочий код:

from selenium import webdriver 
from selenium.webdriver import DesiredCapabilities 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from bs4 import BeautifulSoup as bs 

url = 'http://www.booking.com/searchresults.en-gb.html?label=gen173nr-17CAEoggJCAlhYSDNiBW5vcmVmaFCIAQGYAS64AQTIAQTYAQHoAQH4AQs;sid=1a43e0952558ac0ad0061d5b6523a7bc;dcid=1;checkin_monthday=4;checkin_year_month=2016-2;checkout_monthday=11;checkout_year_month=2016-2;city=-2601889;class_interval=1;csflt=%7B%7D;group_adults=7;group_children=0;highlighted_hotels=1192837;hp_sbox=1;label_click=undef;no_rooms=1;review_score_group=empty;room1=A%2CA%2CA%2CA%2CA%2CA%2CA;sb_price_type=total;score_min=0;si=ai%2Cco%2Cci%2Cre%2Cdi;ss=London;ssafas=1;ssb=empty;ssne=London;ssne_untouched=London&;order=price_for_two' 

# setting a custom User-Agent 
user_agent = (
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) " + 
    "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36" 
) 

dcap = dict(DesiredCapabilities.PHANTOMJS) 
dcap["phantomjs.page.settings.userAgent"] = user_agent 

driver = webdriver.PhantomJS(desired_capabilities=dcap) 
driver.get(url) 

# wait for the total prices to become present 
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".totalPrice"))) 

content = driver.page_source 
driver.close() 

soup = bs(content, 'lxml') 
for e in soup.select('.totalPrice'): 
    print(e.text.strip()) 

Он печатает:

Total: US$781 
Total: US$814 
Total: US$831 
Total: US$864 
Total: US$895 
Total: US$914 
Total: US$915 
Total: US$967 
Total: US$1,031 

В качестве примечания, вы на самом деле не нужно BeautifulSoup - вы можете locate elements with selenium - это довольно мощный. Вот как вы можете найти общие цены:

for price in driver.find_elements_by_css_selector(".totalPrice"): 
    print(price.text.strip()) 
Смежные вопросы