2014-11-07 21 views
6

Próbuję zaindeksować witrynę "http://everydayhealth.com". Jednak okazało się, że strona będzie renderowana dynamicznie. Kiedy kliknę przycisk "Więcej", pojawią się nowe wiadomości. Jednak użycie splintera do kliknięcia przycisku nie pozwala automatycznie zmienić "browser.html" na bieżącą zawartość html. Czy istnieje sposób, aby uzyskać najnowsze źródło html, używając splintera lub selenu? Mój kod w drzazgi jest następujący:Odłamek lub selen: Czy możemy uzyskać aktualną stronę html po kliknięciu przycisku?

import requests 
from bs4 import BeautifulSoup 
from splinter import Browser 

browser = Browser() 
browser.visit('http://everydayhealth.com') 
browser.click_link_by_text("More") 

print(browser.html) 

podstawie @ odpowiedź Louisa, przepisałem program następująco:

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 

driver = webdriver.Firefox() 
driver.get("http://www.everydayhealth.com") 
more_xpath = '//a[@class="btn-more"]' 
more_btn = WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath(more_xpath)) 
more_btn.click() 
more_news_xpath = '(//a[@href="http://www.everydayhealth.com/recipe-rehab/5-herbs-and-spices-to-intensify-flavor.aspx"])[2]' 
WebDriverWait(driver, 5).until(lambda driver: driver.find_element_by_xpath(more_news_xpath)) 

print(driver.execute_script("return document.documentElement.outerHTML;")) 
driver.quit() 

Jednak w tekście wyjściowym, nadal nie mógł znajdź tekst na zaktualizowanej stronie. Na przykład, gdy wyszukuję hasło "Czy Twój przyjaciel lub wróg jest mlekiem", to wciąż nie zwraca ono niczego. Jaki jest problem?

+0

Jak sprawdzić, czy nie ma zmian w kodzie HTML? Na przykład widzę tekst '5 Zioła i przyprawy, które poprawiają twoje zdrowie' w wydrukowanym html i który jest ładowany po kliknięciu przycisku' Więcej'. – alecxe

+0

@alecxe Dzięki za odpowiedź. Myślę, że sprawdzam to w taki sam sposób, jak to sprawdzasz. Powodem, dla którego w wydrukowanym html pojawiło się "5 ziół i przypraw, które poprawiają zdrowie", jest fakt, że artykuł ten był wyświetlany w miniaturce na samej górze strony. Jeśli zaznaczysz inny tytuł wyświetlany po kliknięciu przycisku, na przykład "Czy Twój przyjaciel lub wróg?", Nie znajdziesz go. – xjmfel

Odpowiedz

-1

Kiedy używam Selenium do takich zadań, wiem, że zaktualizowano browser.page_source.

3

z selenem, zakładając, że driver jest Twój zainicjowany WebDriver przedmiot, to daje HTML, który odpowiada stanem DOM w momencie nawiązania połączenia:

driver.execute_script("return document.documentElement.outerHTML;") 

Wartością zwracaną jest ciąg znaków, aby można było:

print(driver.execute_script("return document.documentElement.outerHTML;")) 
+0

dzięki za odpowiedź. Czy możesz rzucić okiem na moje zaktualizowane pytanie? Postępowałem zgodnie z twoimi instrukcjami, ale tekst wyjściowy nadal nie ma nowo wygenerowanego html. – xjmfel

+1

Problem polega na tym, że otrzymujesz kod HTML przed ukończeniem aktualizacji strony. Bardzo prostym sposobem na stwierdzenie, że masz problem z timingiem, jest użycie 'time.sleep (...)' i umieszczenie dowolnej liczby sekund, o których wiesz, że jest wystarczająco duża, aby aktualizacja mogła wystąpić. Jeśli działa ze snem, to wiesz, że masz problem z regulacją czasu. Prawdopodobnie nie czekasz na właściwą rzecz. Wygląda na to, że więcej wiadomości jest ponownie umieszczane na stronie przed dodaniem artykułów. Jest to znacznie inny problem niż tylko uzyskanie dynamicznego kodu HTML. Więc sugerowałbym ... – Louis

+0

... pozwalając na to pytanie tak, jak było pierwotnie, studiując stronę internetową, z którą pracujesz, aby zobaczyć, na co właściwie powinieneś czekać, być może czytając kilka pytań SO dotyczących czekania w Selenium, a następnie publikując nowe pytanie dotyczące czekania, jeśli nadal potrzebujesz pomocy. – Louis