문제

다음 ID를 보유한 분류되지 않은 배열이 있습니다.

@un_array = ['bar', 'para-3', 'para-2', 'para-7']

현명한 사용 방법이 있습니까? 노코 시리 아래 예제 HTML 문서에서 ID의 순서에 따라 배열을 정렬하려면?

require 'rubygems'
require 'nokogiri'

value = Nokogiri::HTML.parse(<<-HTML_END)
  "<html>
    <head>
    </head>
    <body>
        <p id='para-1'>A</p>
        <div id='foo'>
            <p id='para-2'>B</p>
        <p id='para-3'>C</p>
            <div id='bar'>
                <p id='para-4'>D</p>
                <p id='para-5'>E</p>
                <p id='para-6'>F</p>
        </div>
         <p id='para-7'>G</p>
        </div>
        <p id='para-8'>H</p>
    </body>
    </html>"
HTML_END

이 경우 결과적으로 정렬 된 배열은 다음과 같습니다.

['para-2', 'para-3', 'bar', 'para-7']
도움이 되었습니까?

해결책 3

이것은 동료가 솔루션이며 다음과 같이 생각해 냈습니다.

parent = value.css('body').first
indexes = []
parent.children.each do |child|
  indexes << child['id']
end

puts @un_array.sort! { |x,y| indexes.index(x) <=> indexes.index(y) }

먼저 HTML 문서의 모든 ID를 배열로 가져옵니다. @un_array 내가 전에 만든 IDS 배열에 따르면.

다른 팁

Nokogiri가 무엇인지 모르겠지만 HTML 코드를 문자열로 사용하는 경우 Regexp 매칭으로 주문을받을 수 있습니다.

var str = '<html>...</html>'; // the HTML code to check
var ids = ['bar', 'para-3', 'para-2', 'para-7']; // the array with all IDs to check
var reg = new RegExp('(?:id=[\'"])('+ids.join('|')+')(?:[\'"])','g') // the regexp
var result = [], tmp; // array holding the result and a temporary variable
while((tmp = reg.exec(str))!==null)result.push(tmp[1]); // matching the IDs
console.log(result); // ['para-2', 'para-3', 'bar', 'para-7']

이 코드를 사용하면 Regexp 메타 문자가 포함 된 ID에주의해야합니다. 그들은 먼저 탈출해야합니다.

Nokogiri에서 수행하는 한 가지 방법이 있습니다. 더 효율적인 다른 방법이있을 수 있습니다.

require 'set'

#Using a set here to make lookup O(1), because we don't care about the initial order
id_set = ['bar', 'para-3', 'para-2', 'para-7'].to_set
sorted = []

value.root.traverse do |node|
  node_id = node['id']
  sorted << node_id if node_id && id_set.delete?(node_id)
end
# sorted is now ['para-2', 'para-3', 'bar', 'para-7']

편집하다: 여기에 동일한 결과를 얻는 하나의 라이너가 있지만 벤치마킹을 수행하지 않아 어느 것이 더 빠릅니다.

ids = ['bar', 'para-3', 'para-2', 'para-7']
value.xpath("//*[@id]").collect {|node| node['id']} & ids
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top