2017-03-17 2 views
-1

Nokogiri에서 Rails 5를 사용하고 있습니다. 텍스트가 포함 된 가장 작은 요소는 어떻게 선택합니까?텍스트가 포함 된 가장 작은 요소를 선택하는 방법

내 페이지에서이 요소를 가지고 :

<td class="style35" style="font-size: medium; border: thin solid #000000"> 
         Location</td> 

그리고 내가 사용하여 선택할 수 있습니다 생각 :

doc.at('td:contains("Location")') 

는 대신,이 요소를 포함하는 테이블을 포함하는 포장 TD을 선택 :

<td><span class="myClass"><table> .... 

smalle을 선택하는 적절한 방법은 무엇입니까? 내가 원하는 텍스트가 들어있는 st (가장 작은?) 요소?

+2

그것은 "노코 기리는"그것은, "일반 숫자", "선택"은 "노코 기리", "TEH는" "가", "ocntains"입니다입니다 아니에요 "포함"입니다. 문법과 철자법이 중요합니다. 귀하의 질문은 참조 페이지의 시작 부분이며 백과 사전이나 요리 책의 페이지와 같은 해답이 문제의 해결책입니다. –

+1

"[mcve]"를 읽으십시오. 분리 된 덩어리가 아닌 문제를 보여줄 가장 작은 HTML 예제를 제공해야합니다. 우리가 그것을 재구성하지 마십시오. –

답변

-1

모두 td 요소를 선택하고 내용 길이별로 정렬하고 첫 번째 요소를 선택하십시오. 원하는대로 선택기를 변경하십시오. 정렬은 기본적으로 오름차순입니다. 그래서 가장 작은 요소를 먼저 얻습니다.

doc.css('td').sort_by do |td_element| 
    l.text.length 
end.first 
+0

내 경우에는 로직이 작동하지 않습니다. "doc.at ('td : contains ("Location ")')"은 "doc.at ('td : contains ("Location ")')를 실행하는 단일 요소 만 반환합니다.('td : contains ("Location")') "이 특정 사례에 대해 원하는 요소를 얻을 수 있지만 일반적으로 원하는 수준을 파악할 수있는 수준을 알 수는 없습니다. – Dave

+0

좋은 논리가 아닙니다. 후속 셀에 원하는 문자열보다 짧은 문자열이 포함될 수 있습니다. 또한 예제 코드가 유효하지 않습니다. 샘플 HTML에 대해 코드를 테스트하고 결과를 표시하는 것이 좋습니다. –

0

at 메서드를 사용하면 첫 번째 결과 만 반환됩니다.

css 메서드는 CSS 선택기와 일치하는 모든 요소 (올바른 td 요소 및 td 요소 모두를 전체 테이블로 묶음)를 반환합니다.

이 같은 것을 사용하는 경우는, 다음 배열에 다른 TD 태그 감싸되지 않은 요소를 저장할 단어 Location을 포함, 모든 td 태그를 찾을 수 있습니다 :

td_with_no_child_and_have_location = [] 

doc.css("td:contains('Location')").each do |td_element| 
    if td_element.css("td").empty? 
     td_with_no_child_and_have_location << td_element 
    end 
end 

first_td = td_with_no_child_and_have_location.first 
+0

잘 설명하고 있지 않습니다. . 나는 최소한의 HTML로 TD를 원하지 않는다. 다른 TD를 가지고 있지 않은 TD와 텍스트에 "Location"이라는 단어가 들어있는 TD를 원한다. – Dave

+0

내 대답을 업데이트하여 맞는 요소의 배열을 저장한다. 당신의 요소가 항상 첫 번째가 될 것이라는 것을 알고 있다면 배열의 첫 번째 요소를 사용할 수 있습니다. –

+0

이 업데이트를 해주셔서 감사합니다. 한 행에 수행 한 작업을 수행하는 CSS 선택기를 작성하는 방법이 있습니까? 루프? – Dave

0

그것은의를 최소 HTML을 제공하지 않으면 귀하를 도울 수 없습니다. 나는 그것을 다시하지만 YMMV 시도 : 원하는 태그가 다른 테이블에 포함되어있는 경우

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<html><body><table><tr> 
<td><span class="myClass"><table><tr> 
     <td class="style35" style="font-size: medium; border: thin solid #000000"> 
     Location</td> 
</tr></table></td></tr></table></html> 
EOT 
doc.at('.myClass td.style35').text # => "\n  Location" 

는 다음과 같은 클래스 정보로 탐색 할 수 있도록 다른 특성의 일부를 활용.

일반적으로 표의 제목이 첫 번째 셀을 포함 할 첫 번째 행에 있기 때문에 at을 사용하면이 경우 도움이됩니다. atsearch('some selector').first과 같습니다.

위의 선택기는 .myCLass .style35 또는 td td으로 작성되어 다른 td 안에 td를 찾을 수도 있습니다. at와 그 결합하고 당신은 최초의 발생을 얻을 것 :

doc.at('.myClass td.style35').text # => "\n  Location" 
doc.at('.myClass .style35').text # => "\n  Location" 
doc.at('td td').text # => "\n  Location" 
+0

나는 좀 더 일반적인 것을 somethign을 찾고있다. TD가 항상 "myClass"를 클래스로 가지는 것은 아닙니다. 그 안에 다른 TD가없는 주어진 텍스트가 들어있는 TD를 찾고 있습니다. – Dave

+0

질문에 더 많은 정보를 입력해야합니다. 이는 매우 광범위하며 "[mcve]"의 지침을 충족하지 않습니다. 당신이 현상금을 가지고 있기 때문에 우리는 투표 할 수 없습니다. 제목이나 문서의 구조가 무엇인지 미리 모른 채 일반 "항상 제목 찾기"셀을 작성하려는 경우 어려움을 겪을 것입니다. –