2009-08-07 5 views
4

방금 ​​Ruby를 배우기 시작했습니다. 아주 좋아하는 언어, 많이 좋아합니다.Hpricot, 문서의 모든 텍스트 얻기

매우 편리한 Hpricot HTML 파서를 사용하고 있습니다.

내가하고 싶은 것은 HTML 태그를 제외하고 페이지의 모든 텍스트를 가져 오는 것입니다. 나는 기본적으로 내가 너무 같은 문자열로 끝날 텍스트 만 잡아 걸려

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
     <title>Data Protection Checks</title> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    </head> 
    <body> 
     <div> 
     This is what I want to grab. 
     </div> 
     <p> 
     I also want to grab this text 
     </p> 
    </body> 
</html> 

: 예

.

"이것은 내가 잡아 원하는 것입니다 또한 원하는 이 텍스트를 움켜 잡으십시오. "

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

건배

EEF

답변

10

당신은는 XPath에게 text() 선택기를 사용하여이 작업을 수행 할 수 있습니다.

require 'hpricot' 
require 'open-uri' 

doc = open("http://stackoverflow.com/") { |f| Hpricot(f) } 
text = (doc/"//*/text()") # array of text values 
puts text.join("\n") 

그러나 이것은 상당히 비싼 작업입니다. 더 나은 솔루션을 사용할 수 있습니다.

+0

@Eef, 당신은 텍스트 배열'(문서/"스크립트")를 수집하기 전에 자바 스크립트 코드를 제거해야 할 수 있습니다 각 {| JS |. js.inner_html = ''}'. – Andrei

0

@weppos :이 조금 더 좋을 것이다는 :

text = doc/"//p|div/text()" # array of text values 
+1

그래,하지만 그는 단지 p와 div를 원한다고 가정합니다. 나는 그가 모든 것을 원한다고 생각한다. – Geo

2

당신은 inner_text 시도 할 수 있습니다. 이처럼

:

h = Hpricot("<html><body><a href='http://yoursite.com?utm=trackmeplease'>http://yoursite.com</a> is <strong>awesome</strong>") 
puts h.inner_text 
http://yoursite.com is awesome