2014-11-07 13 views
6

Tôi đang cố gắng thu thập dữ liệu trang web "http://everydayhealth.com". Tuy nhiên, tôi thấy rằng trang sẽ được hiển thị động. Vì vậy, khi tôi nhấp vào nút "Thêm", một số tin tức mới sẽ được hiển thị. Tuy nhiên, sử dụng splinter để nhấp vào nút không cho phép "browser.html" tự động thay đổi thành nội dung html hiện tại. Có cách nào để cho nó nhận được nguồn html mới nhất, bằng cách sử dụng hoặc splinter hoặc selen? Mã của tôi trong ly khai như sau:Splinter hoặc Selenium: Chúng tôi có thể tải trang html hiện tại sau khi nhấp vào nút không?

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) 

Dựa trên @ câu trả lời Louis, tôi viết lại chương trình như sau:

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

Tuy nhiên, trong văn bản đầu ra, tôi vẫn không thể tìm văn bản trong trang được cập nhật. Ví dụ, khi tôi tìm kiếm "Sữa của bạn là bạn của bạn hay kẻ thù?", Nó vẫn không trả lại gì cả. Có chuyện gì vậy?

+0

Làm thế nào để bạn kiểm tra xem không có thay đổi trong HTML? Ví dụ, tôi thấy '5 Herbs và gia vị tăng cường sức khỏe của bạn' bên trong html in và được tải sau khi nhấp vào nút' More'. – alecxe

+0

@alecxe Cảm ơn bạn đã trả lời. Tôi nghĩ rằng tôi kiểm tra nó giống như cách bạn kiểm tra nó. Lý do mà bạn tìm thấy "5 loại thảo mộc và gia vị làm tăng sức khỏe của bạn" xuất hiện trong html in là bởi vì bài viết này đã xảy ra để được hiển thị trong hình thu nhỏ ở đầu trang web. Nếu bạn kiểm tra bất kỳ tiêu đề nào khác hiển thị sau khi nhấp vào nút, ví dụ "Có phải là bạn của bạn hoặc kẻ thù?", Bạn sẽ không tìm thấy nó. – xjmfel

Trả lời

-1

Khi tôi sử dụng Selenium cho các tác vụ như thế này, tôi biết browser.page_source không được cập nhật.

3

Với Selenium, giả định rằng driver được khởi WebDriver đối tượng của bạn, điều này sẽ cung cấp cho bạn mã HTML tương ứng với trạng thái của DOM tại thời điểm bạn thực hiện cuộc gọi:

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

Giá trị trả về là một chuỗi để bạn có thể làm:

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

cảm ơn câu trả lời của bạn. Bạn có thể vui lòng xem câu hỏi được cập nhật của tôi không? Tôi đã làm theo hướng dẫn của bạn, nhưng văn bản đầu ra vẫn không có html mới được tạo ra. – xjmfel

+1

Sự cố bạn gặp phải là bạn đang nhận được HTML trước khi trang cập nhật xong. Một cách rất dễ dàng để biết rằng bạn có vấn đề về thời gian là sử dụng 'time.sleep (...)' và đặt một số giây tùy ý mà bạn biết là đủ lớn để cập nhật diễn ra. Nếu nó hoạt động với giấc ngủ thì bạn biết bạn có vấn đề về thời gian. Có thể bạn không chờ đợi điều đúng. Có vẻ như nút tin tức hơn được đưa trở lại trang trước khi các bài viết được thêm vào. Đây là một vấn đề khác biệt đáng kể so với việc chỉ nhận được HTML động. Vì vậy, tôi sẽ đề nghị ... – Louis

+0

... cho câu hỏi này như ban đầu, nghiên cứu trang web bạn đang làm việc để xem bạn nên chờ đợi điều gì, có lẽ đọc một số câu hỏi SO về việc chờ đợi ở Selenium và sau đó đăng câu hỏi mới về việc chờ đợi cụ thể nếu bạn vẫn cần trợ giúp. – Louis

Các vấn đề liên quan