2014-11-13 3 views
1

정확한 요소 ID가 없지만 일반 형식을 알고있는 경우 정규 표현식이나 "좋아요"기능을 사용할 수 있습니까?Regex에서 ID를 선택하십시오

은 현재 내가

doc.css('table[id="UTA_basic"]//tbody') 

을 가지고 있지만 나는 ID와 같은 XYZ_basic, 또는 _basic가 작동하는 것처럼 심지어 모든 테이블에 모든 테이블을 찾을 싶습니다.

필요한 경우 xpath로 전환 할 수 있습니다. , 경우

그러나이 방법으로 제공 할 수 있습니다 당신은 위양성 :

doc.xpath('//table[contains(@id, "_basic")]/tbody') 

참고 :

+1

"doc.xpath ('// table [포함 된 (@id,"_basic ")]/tbody') ' –

+0

@CasimiretHippolyte 당신이 그것을 게시하고 싶다면 작동하는 것처럼 보입니다. 대답 간단한 정규식 솔루션이 없다면 받아 들일 것입니다. –

+0

nokogiri를 사용할 때 regex 솔루션을 사용하면 이미 DOM 트리 구축 비용을 지불했기 때문에 자원 낭비가 거의 없습니다. –

답변

1

당신은 id 속성이 "_basic"문자열이 포함되어 있는지 확인합니다 XPath는 기능 contains을 사용할 수 있습니다 예를 들어, _basical_basic_1과 같은 ID를 사용하여 문서 테이블 태그에 존재합니다.이 함수는 위치 또는 문자를 검사하지 않지만 부분 문자열 만 있기 때문에 존재합니다. 당신이 정말 그렇게 정확해야하는 경우

것은,이 같은 XPath는 2.0 기능 ends-with을 에뮬레이션하여이 문제를 해결할 수 :

doc.xpath('//table[substring(@id,string-length(@id)-string-length("_basic")+1)="_basic")]/tbody') 
2

노코 기리은 CSS와 XPath를 모두 자신의 태그 매처 (matcher)를 생성 할 수있는 기능을 지원합니다 셀렉터. css를 들어

은 :

사용자 정의 CSS 의사 클래스도 정의 할 수있다. 사용자 정의 의사 클래스를 정의하려면 클래스를 작성하고 정의하려는 사용자 정의 의사 클래스를 구현하십시오. 메서드의 첫 번째 인수는 현재 일치하는 NodeSet입니다. 다른 인수는 전달 것들 예를 들면 다음과 같습니다. 마찬가지로

node.css('title:regex("\w+")', Class.new { 
    def regex node_set, regex 
    node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ } 
    end 
}.new) 

, xpath을 위해 :

사용자 정의 XPath 함수도 정의 할 수있다. 사용자 정의 함수를 정의하려면 클래스를 만들고 정의 할 함수를 구현하십시오. 메서드의 첫 번째 인수는 현재 일치하는 NodeSet입니다. 다른 모든 인수는 전달하는 인수입니다.이 클래스는 인수 목록의 아무 곳에 나 나타날 수 있습니다. 예를 들면 : 당신이 태그 및 매개 변수에 대한 자세한 정보를 제공합니다 싶지만, 내가 도와 줄 방법을 많이 볼 함께 연주 해본 적이 없어처럼

node.xpath('.//title[regex(., "\w+")]', Class.new { 
    def regex node_set, regex 
    node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ } 
    end 
}.new) 

이 기능이 보인다.

doc.css('table[id="UTA_basic"]//tbody'). CSS처럼 보이지는 않지만 대신 XPath 표현식처럼 보이며이를 css으로 전달하면 Nokogiri가 혼란 스럽습니다. 또한 구문 분석중인 HTML에 실제로 tbody 태그가 있는지 확인하십시오. 그것들은 테이블을 생성하는 사람들에 의해 거의 사용되지 않지만 브라우저는 HTML을 구문 분석 할 때 테이블에 넣는 것을 좋아합니다. 브라우저 내에서 HTML 소스를 보면 표시되지만 소스에서 찾을 수 없으므로 일반적으로 검색에 포함시키지 않습니다.

관련 문제