2016-11-13 2 views
0

많은 표 행이있는 이메일을 스크랩하는 중 일부를 제외하고 싶습니다. 내가 할 테이블 행은 정확히 을 볼 같은 필요 : 테이블 행의특정 내용이 포함 된 표 행만 선택하는 방법

<tr> 
    <td class="quantity"> ANYTHING BUT EMPTY </td> 
    <td class="description"> ANYTHING BUT EMPTY </td> 
    <td class="price"> ANYTHING BUT EMPTY </td> 
</tr> 

없음 클래스 또는 ID가 없습니다. 더욱이 이러한 클래스의 셀을 포함하고 있지만 값이없는 셀이있는 행은 원치 않는 <table>이므로이 세 클래스의 셀을 가진 테이블 행과 비어 있지 않은 값을 가진 세 셀을 모두 가져와야합니다. 나는이 작업을 수행 할 구문의 확실하지 않다 :

body = Nokogiri::HTML(email) 
wanted_rows = body.css('tr').select{ NOT SURE HOW TO ENCAPSULATE LOGIC HERE } 
+0

일반적으로'select {| e | ...}'당신의 엘리먼트'e'에 어떤 메소드 호출이 있는데 그것은 뭔가를 의미합니다. 예를 들어, 적어도 하나의 공백이 아닌 문자를 테스트하려면'e.html.match (/ \ S /)'를 사용하십시오. – tadman

+0

.select와 iterators가 일반적으로 어떻게 작동하는지 이해합니다. 적절한 클래스를 가진 비어 있지 않은 셀을 포함하는 테이블 행만 선택하는 로직을 캡슐화하는 방법을 모르겠습니다. – TDB

+0

안녕하십니까. 이와 같은 질문을 할 때 데이터를 포함하는 두 줄과없는 줄과 같이 문제를 설명 할 수있는 최소한의 데이터가있는 HTML의 더 좋은 예를 제공하면 도움이됩니다. "[mcve]"는 이것에 대해 이야기합니다. 당신이 앞장서 서면할수록 우리가 당신을 도울 수있는 시간이 빠를수록 질문과 데이터가 정확할수록 정확해질 수 있습니다. 그것은 당신이 다른 말로 우리를 도울 수 있도록 도와줍니다. 입력을 조정하기 위해 추가 작업을 할 수는 있지만, 실제로 느려지고 실제로 도움을 꺼리게됩니다. –

답변

1

이 XPath를 가진 매우 간단합니다 : 그들은 현재 노드가 있는지 확인 즉

wanted_rows = body.xpath('//tr[td[(@class = "quantity") and normalize-space()] 
    and td[(@class = "description") and normalize-space()] 
    and td[(@class = "price") and normalize-space()]]') 

normalize-space() 통화가 효과적으로 normalize-space(.) != ""과 동일 (td)에는 공백 이외의 것이 포함되어 있습니다.

+0

예! 정말 고마워. 그냥 시도해 보면 효과가 있습니다. 이제 XPath에서 읽어 볼 시간 ... – TDB