2009-06-29 7 views
1

특정 기준 (class = "int"또는 class = "ext")을 충족시키지 못하는 HTML 페이지 (실제로는 tinymce 사용자 입력)에서 모든 이미지를 제거하고 올바른 접근 방식으로 어려움을 겪고 있습니다. .Hpricot Element 교차점

hbody = Hpricot(input) 
@internal_images = hbody.search("//img[@class='int']") 
@external_images = hbody.search("//img[@class='ext']") 

하지만 클래스가 잘못된 값 (안 "INT"또는 "내선")이 경우 이미지를 찾을 방법을 모르는 : 그건 내가 지금까지 뭘하는지입니다.

표준 HTML이 아닌 다른 속성을 검사하기 위해 요소를 반복해야합니다 (속성 dbsrc에서 설정 한 DB id와 같은 내부 값을 설정하는 데 사용합니다). 이러한 속성에 대해서도 액세스 할 수 있습니까? 그리고 hpricot 검색 결과에있는 특정 요소가 기준을 충족시키지 않을 때 해당 요소를 제거 할 수 있습니까?

도움 주셔서 감사합니다.

답변

3
>> doc = Hpricot.parse('<html><img src="foo" class="int" /><img src="bar" bar="42" /><img src="foobar" class="int"></html>') 
=> #<Hpricot::Doc {elem <html> {emptyelem <img class="int" src="foo">} {emptyelem <img src="bar" bar="42">} {emptyelem <img class="int" src="foobar">} </html>}> 
>> doc.search("img")[1][:bar] 
=> "42" 
>> doc.search("img") - doc.search("img.int") 
=> [{emptyelem img src"bar" bar"42"}] 

정상적인 배열 작업을 사용할 수 있습니다. 비표준 속성은 []를 통해 액세스 할 수 있습니다.

+0

와우, 아주 쉽게 "collection_one - collection_two"를 사용하여 collection_tone에서 collection_one의 모든 요소를 ​​제거 할 수 있습니까? 감사! –

+0

중요 사항 :'z = x-y' 다음에 x는 바뀌지 않을 것입니다. z는 단지 y에없는 모든 x를 포함 할 것입니다. – rampion

+0

예, 컬렉션을 추가하려면 +를 입력하십시오. 'all_images - (내부 이미지 + 외부 이미지)'. –

2

not CSS selector을 확인하십시오.

(hbody."img:not(.int)") 
(hbody."img:not(.ext)") 

불행히도, 표현식을 연결하지 못하는 것 같습니다. 모든 img 노드를 가져와 .css 선택자가 .int 또는 .ext를 포함하지 않는 노드를 제거 할 수 있습니다. 또한 차이 연산자를 사용하여 두 요소 중 일부 요소가 아닌 요소를 계산할 수 있습니다.

노드 또는 요소를 제거하려면 .remove 메서드를 사용하십시오 (Hpricot Altering).

+0

search (": not (.ext)"). search (": not (.ext)")는 검색을 연결하여 원하는 결과를 얻을 수있었습니다. 클래스는 "int"가 아니며 "ext"가 아닙니다. 그 (것)들을 제거한 후에 나는 다른 속성을 검사하고 기본적으로 동일을 할 수있다. 다시 한 번 감사드립니다! –