2014-11-07 5 views
6

"http://everydayhealth.com"웹 사이트를 크롤링하려고합니다. 그러나 페이지가 동적으로 렌더링된다는 것을 알게되었습니다. 따라서, "More (추가)"버튼을 클릭하면 몇 가지 새로운 뉴스가 표시됩니다. 그러나, 단추를 클릭하기 위해 splinter를 사용하면 "browser.html"이 현재 HTML 컨텐트로 자동 변경되지 않습니다. 스플린터 (splinter) 또는 셀레늄 (selenium) 중 하나를 사용하여 최신 HTML 소스를 얻을 수있는 방법이 있습니까? 다음과 루이스의 대답 @를 바탕으로Splinter or Selenium : 버튼을 클릭 한 후 현재 HTML 페이지를 볼 수 있습니까?

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) 

, 나는이 프로그램을 다시 썼다 : 다음과 같이 가시에 내 코드가

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

를 그러나 출력 텍스트에서, 나는 아직도 할 수 없었다 업데이트 된 페이지에서 텍스트를 찾으십시오. 예를 들어, "Milk Your Friend or Foe?"를 검색하면 여전히 아무것도 반환하지 않습니다. 뭐가 문제 야?

+0

HTML에 변경 사항이없는 것을 어떻게 확인합니까? 예를 들어 인쇄 된 html 안에 '5 가지 허브와 향신료가 건강을 더 돋보이게합니다'라는 텍스트가 표시되며 '더보기'버튼을 클릭하면로드됩니다. – alecxe

+0

@alecxe 답장을 보내 주셔서 감사합니다. 나는 당신이 그것을 확인하는 것과 같은 방식으로 그것을 체크한다고 생각한다. 이 기사가 웹 페이지의 맨 위에있는 축소판에 표시 되었기 때문에 인쇄 된 HTML에 "5 나물 및 향신료가 건강을 더 돋 웁니다."라는 이유를 발견했습니다. "Milk Your Friend or Foe?"와 같이 단추를 클릭 한 후 표시되는 다른 제목을 확인하면 찾을 수 없습니다. 회신에 감사드립니다. – xjmfel

답변

-1

이와 같은 작업에 Selenium을 사용하면 browser.page_source이 업데이트된다는 것을 알고 있습니다.

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

반환 값은 다음과 같습니다 driver이 초기화 WebDriver 개체, 이것은 당신에게 시간에 DOM의 상태에 해당하는 HTML을 줄 것이다된다고 가정 셀레늄

3

, 당신은 전화를 걸 문자열을 사용하면 할 수 있습니다.

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

업데이트 된 질문을 살펴보실 수 있습니까? 나는 당신의 지시를 따랐지만, 출력 된 텍스트는 여전히 새로 생성 된 html이 없다. – xjmfel

+1

문제는 페이지가 업데이트되기 전에 HTML을 가져 오는 것입니다. 타이밍 문제가 있다는 것을 아는 아주 쉬운 방법은'time.sleep (...) '을 사용하고 업데이트가 발생할만큼 충분히 큰 임의의 초를 넣는 것입니다. 잠과 잘 작동하면 타이밍 문제가 있음을 알게됩니다. 당신은 옳은 일을 기다리지 않고있을 것입니다. 기사가 추가되기 전에 더 많은 뉴스 버튼이 페이지에 다시 삽입되는 것처럼 보입니다. 이는 동적 HTML을 가져 오는 것보다 현저히 다른 문제입니다. 그래서 제안 할 것입니다 ... – Louis

+0

... 원래이 질문을시키는 것은 당신이 실제로 기다리고 있어야하는 웹 페이지를 연구하면서 아마도 Selenium에서 기다리는 것과 관련하여 몇 가지 질문을 읽었을 것입니다. 여전히 도움이 필요하면 특별히 기다리는 것에 관한 새로운 질문을 게시하십시오. – Louis