2015-07-17 2 views
1

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

from bs4 import BeautifulSoup  
import requests 

def getHTML(url): 
    headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0'} 
    r = requests.get(url, headers=headers, allow_redirects=True, timeout=None) 
    #print r.headers 
    soup = BeautifulSoup(r.content, 'html.parser') 
    return soup 


def main(): 
    source = getHTML('http://connected2.me') 
    for link in source.find_all('ul'): 
     print(link) 


if __name__ == '__main__': 
    main() 

данные мне нужно получить сформировать источник в этом списке

<ul class="usersOnlineList clear"></ul> 

, но результат всегда это

<ul class="usersOnlineList clear"> 
</ul> 
<ul> 
<li><input class="inptIcn icnUser" data-validate="validate(required, username, minlength(3), maxlength(25))" id="fos_user_registration_form_username" maxlength="255" name="fos_user_registration_form[username]" pattern=".{3,255}" placeholder="username" required="required" type="text" value=""/></li> 
<li><input class="inptIcn icnPass" data-validate="validate(required, minlength(6))" id="fos_user_registration_form_plainPassword" name="fos_user_registration_form[plainPassword]" placeholder="password" required="required" type="password" value=""/></li> 
<li><input class="inptIcn icnEmail" data-validate="validate(required, email)" id="fos_user_registration_form_email" maxlength="255" name="fos_user_registration_form[email]" pattern=".{2,255}" placeholder="email" required="required" type="email" value=""/></li> 
<li class="formActions"><input class="btn btnGreen" id="signup-btn" name="signup-btn" type="submit" value="Sign Up!"/></li> 
</ul> 

список является недействительным. Почему я не могу получить элементы списка только из этого списка?

+0

Вы пробовали распечатать текст? 'print link.text' –

+0

Не имеет значения, данных, которых он не существует в документе. Эти данные загружаются динамически, на лету. – p1x3l

ответ

4

Это потому, что <ul class="usersOnlineList clear"></ul> содержание JavaScript впрыски. Вы должны дождаться, когда это будет вставлено, и requests не могут этого сделать. selenium может быть решением для этого:

from bs4 import BeautifulSoup 
from selenium import webdriver 

driver = webdriver.Firefox() 
driver.set_page_load_timeout(5) 

def main(): 
    driver.get("http://connected2.me") 
    source = BeautifulSoup(driver.page_source, 'html.parser') 

    for link in source.find_all('ul', {'class': 'usersOnlineList'}): 
     print(link) 

    driver.close() 

if __name__ == '__main__': 
    main() 
+1

Вы метод работает как шарм, спасибо! Есть ли способ не открывать мой браузер, я имею в виду скрытый? – p1x3l

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