2009-11-29 6 views
7

Trang tôi đang nhìn chứa:Cách lấy nguồn html của một phần tử cụ thể bằng selen?

<div id='1'> <p> text 1 <h1> text 2 </h1> text 3 <p> text 4 </p> </p> </div> 

Tôi muốn để có được tất cả các văn bản trong div, trừ các văn bản đó là trong <h>. (Tôi muốn nhận "văn bản 1", "văn bản 3" và "văn bản 4") Có thể có một vài yếu tố <h> hoặc không có gì cả. Và có thể có một vài yếu tố <p>, ngay cả một trong các phần tử khác hoặc không có phần tử nào.

Tôi đã nghĩ đến điều này bằng cách lấy tất cả nguồn html của div và sử dụng regex để xóa các phần tử <h>. Nhưng selenium.get_text không trả lại html, chỉ là văn bản (tất cả!).

Tôi biết tôi có thể sử dụng selenium.get_html_source và sau đó tìm phần tử tôi cần bằng regex, nhưng có vẻ như chất thải vì selenium biết cách tìm phần tử.

Có ai có giải pháp tốt hơn không? Cảm ơn :)

Trả lời

9

Đoạn mã dưới đây sẽ cung cấp cho bạn các HTML trong phần tử div:

sel = selenium('localhost', 4444, browser, my_url) 
html = sel.get_eval("this.browserbot.getCurrentWindow().document.getElementById('1').innerHTML") 

sau đó bạn có thể sử dụng BeautifulSoup để phân tích nó và trích xuất những gì bạn thực sự muốn.

Tôi hy vọng nó sẽ giúp

+0

Cảm ơn! Nó giải quyết được vấn đề :) – Rivka

+0

vậy tại sao bạn không chấp nhận câu trả lời? :) – luc

+0

Xin lỗi, tôi mới ở trang này ... Bạn có nghĩa là nhấp vào v, phải không? – Rivka

1

Còn việc sử dụng jQuery thì sao?

Edit:

Trước tiên, bạn cần phải thêm các tập tin JS yêu cầu, cho rằng đi đến www.jQuery.com.

Sau đó, tất cả các bạn cần làm là gọi một jQuery selector đơn giản:

alert($("div#1").html()); 
+0

Tôi không biết jQuery. Bạn có thể cho tôi một ví dụ không? Cảm ơn! – Rivka

4

Sử dụng xpath. Từ selenium.py:

Nếu không có một tiền tố định vị rõ ràng, Selenium sử dụng các chiến lược mặc định sau đây: "tài liệu"

  • \ ** dom ** \, cho định vị bắt đầu với
  • \ ** xpath ** \, cho định vị bắt đầu bằng "//"
  • \ ** ** nhận dạng \, nếu không

Trong trường hợp của bạn, bạn có thể thử

selenium.get_text("//div[@id='1']/descendant::*[not(self::h1)]") 

Bạn có thể tìm hiểu thêm về xpath here.

P.S. Tôi không biết nếu có tài liệu HTML tốt có sẵn cho python-selenium, nhưng tôi đã không tìm thấy bất kỳ; mặt khác, các tài liệu của tệp selenium.py dường như là tài liệu toàn diện. Vì vậy, tôi khuyên bạn nên tìm kiếm nguồn để hiểu rõ hơn về cách hoạt động của nó.

0

Câu trả lời được chọn không hoạt động trong Python 3 tại thời điểm viết bài. Thay vào đó, hãy sử dụng:

from selenium import webdriver 

wd = webdriver.Firefox() 
wd.get(url) 
return wd.execute_script('return window.document.getElementById('1').innerHTML')