2016-02-21 5 views
0

Noob здесь. Я пытаюсь скрести результаты поиска с этого сайта: http://www.mastersportal.eu/search/?q=di-4|lv-master&order=relevanceBeautifulSoup Скребок: загрузка div вместо содержимого

Я использую Питон BeautifulSoup

import csv 
import requests 
from BeautifulSoup import BeautifulSoup 

for numb in ('0', '69'): 
     url = ('http://www.mastersportal.eu/search/?q=ci-30,11,10,3,4,8,9,14,15,16,17,34,1,19|di-4|lv-master|rv-1&start=' + numb + '0&order=tuition_eea&direction=asc') 
     response = requests.get(url) 
     html = response.content 

     soup = BeautifulSoup(html) 
     table = soup.find('div', attrs={'id': 'StudySearchResults'}) 

     lista = [] 
     for i in table.findAll('h3'): 
      lista.append(h3.string) 
print(table.prettify()) 

Я хочу, чтобы получить чистые данные с базовой информацией о Master (на данный момент только имя). URL-адрес, который я использую здесь, предназначен для отфильтрованных исследований на веб-сайте, и цикл для продолжения со страницами должен быть в порядке.

Однако результаты:

<div id="StudySearchResults"> 
    <div style="display:none" id="TrackingSearchValue" class="TrackingSearchValue" data-search=""></div> 
    <div style="display:none" id="SearchViewEvent" class="TrackingEvent TrackingNoLocation" data-type="srch" data-action="view" data-id=""></div> 
    <div id="StudySearchResultsStudies" class="TrackingLinkedList" data-start="" data-list-type="study" data-type="rslts"> 
    <!-- Wait pane, just here to make sure there is no white page --> 
    <div id="WaitPane" class="WaitPane"> 
     <img src="http://www.mastersportal.eu/Modules/Results/Resources/Throbber.gif" /> 
     <span>Loading search results...</span> 
    </div> 
    </div> 
</div> 

Почему содержание не отображается, но только загрузка DIV? Просматривая, я чувствую, что это связано с тем, как сайт обрабатывает данные с помощью JavaScript, для Python существует нечто вроде запроса AJAX? (или каким-либо другим способом сказать скребку дождаться загрузки страницы?)

+0

Попробуйте 'h3.get_text()' вместо 'h3.string'. [Docs] (http://www.crummy.com/software/BeautifulSoup/bs4/doc/#get-text) – Obsidian

+0

Страница делает запросы ajax для получения данных json в формате, вам нужно напрямую обращаться к конечным точкам api (проверьте вкладку сети в Chrome devtools) –

+0

что вы пытаетесь получить со страницы, что такое «мастер»? –

ответ

-1

В основном вы ответили на свой вопрос. Beautiful Soup - это чистый веб-скребок, который будет загружать только то, что сервер возвращает для определенного URL-адреса.

Если вы хотите отобразить страницу так, как показано в браузере, вам нужно будет использовать что-то вроде Selenium Webdriver, который запустит фактический браузер и удалит его.

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

Если вы хотите использовать Webdriver с Python, то official documentation - хорошее место для начала.

+0

Спасибо за ресурсы. Вы правы, на моем уровне это может быть немного сложно погрузиться, но очень необходимо! –

+0

Идите к нему непременно. Я не собирался сдерживать вас, но должен был убедиться, что вы знаете, в чем вы нуждаетесь. – jsfan

0

если вы хотите только текст, вы должны сделать это

lista.append(h3.get_text()) 

Что касается вашего второго вопроса, то ответ jsfan является правильным. Вы должны попробовать Selenium и использовать его wait функцию ждать результатов поиска, которые появляются в divs с именами классов Result master premium

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "div[@class*='Result master premium'])) 
) 
+0

Правильно, мне сначала нужно понять использование Selenium, и тогда я буду использовать этот метод. Благодаря! –