2016-08-29 1 views
0

웹에서 내용을 가져 오기 위해 nokogiri lib에 어려움을 겪어 왔지만 중첩 태그없이 텍스트 만 가져 오는 방법을 이해하지 못했습니다. 여기 내가 여기 nokogiri 특정 HTML 구조체 인 경우에만 텍스트 가져 오기

<div class="line1">text I need 
<br><div class="podp_k">group:</div><a class="GR" title="go to this group" href="#" rel="?sectID=2">group 1</a> 
<br> 
<div class="podp_k">brand:</div><a class="BR" title="go to brand" href="#" rel="?sectID=0&amp;brand=16">China&nbsp;&nbsp;CHINA</a> 
</div> 

내가

tagcloud_elements = nokogiri_object.css("div#products_tbody > table > tbody > tr > td > div.line1 > text()") 
f.puts tagcloud_element.text.gsub(/^\s+/,'') 

GSUB 않습니다 거의 정확히 내가해야 할 말을 긁어 방법입니다 구문 분석,하지만 난 후 공백의 수를 왼쪽, 오른쪽 것입니다. 누구든지 위의 예에서 "필요한 텍스트"만 가져 오는 가장 좋은 방법을 제안 할 수 있습니까?

+0

"[mcve]"를 읽으십시오. 예상되는 결과는 무엇입니까? 선택자 목록이 길면 언제든지 코드를 더욱 허약하게 만들 수 있습니다. HTML이 변경되면 선택기가 중단 될 가능성이 높습니다. 대신 직접 원하는 정확한 태그를 찾을 수 없다면 HTML에서 자리 표시자를 찾아서 해당 항목으로 이동 한 다음 원하는 항목을 얻을 때까지 다음 항목으로 이동하십시오. 결과 코드가 훨씬 더 탄력적입니다. –

+0

'div # products_tbody> table> tbody> tr> td> div.line1> text()''와 같이 대상에 대한 모든 중간 태그를 정의하는 긴 선택자를 사용할 때는 매우 신중해야합니다. HTML이 변경되면 코드가 손상됩니다. 대신 'div # products_tbody div.line1'과 같은 간단한 선택기를 기반으로하십시오. 그런 식으로 테이블이 사라질 수 있고 내용이'div.line1' 안에 있다면 당신은 그것을 찾을 수 있습니다. –

답변

1

문서를 더 이상 사용하지 않는 경우이 섹션에있는 다른 노드를 삭제합니다.

nokogiri_object.css("div.line1 *").each(&:remove) 
nokogiri_object.at_css("div.line1").text.strip # => "text I need" 
+0

실제로 "필요한 텍스트"도 삭제합니다. – Evgeny