ruby
  • nokogiri
  • hpricot
  • 2009-10-12 16 views 23 likes 
    23

    Given:Làm cách nào để thực hiện tìm kiếm regex trong Nokogiri cho văn bản khớp với một khởi đầu nhất định?

    require 'rubygems' 
    require 'nokogiri' 
    value = Nokogiri::HTML.parse(<<-HTML_END) 
    "<html> 
    <body> 
        <p id='para-1'>A</p> 
        <div class='block' id='X1'> 
        <h1>Foo</h1> 
        <p id='para-2'>B</p> 
        </div> 
        <p id='para-3'>C</p> 
        <h2>Bar</h2> 
        <p id='para-4'>D</p> 
        <p id='para-5'>E</p> 
        <div class='block' id='X2'> 
        <p id='para-6'>F</p> 
        </div> 
    </body> 
    </html>" 
    HTML_END 
    

    tôi muốn làm một cái gì đó giống như những gì tôi có thể làm trong Hpricot:

    divs = value.search('//div[@id^="para-"]') 
    
    1. Làm thế nào để thực hiện tìm kiếm mô hình cho các yếu tố trong phong cách XPath?
    2. Tôi sẽ tìm tài liệu ở đâu để giúp tôi? Tôi không thấy điều này trong rdocs.
    +0

    PSA: Đối với những người cố gắng regex phức tạp hơn, điều này có thể những gì bạn đang tìm kiếm: http://stackoverflow.com/questions/649963/ nokogiri-searching-for-div-using-xpath – DreadPirateShawn

    Trả lời

    64

    Sử dụng chức năng xpath starts-with:

    value.xpath('//p[starts-with(@id, "para-")]').each { |x| puts x['id'] } 
    
    +29

    Chà, Aaron tự mình trả lời! – khelll

    +1

    @khelll có gì tuyệt vời trong Aaron? –

    +5

    Tác giả của thành viên nhóm Nokogiri và RoR. – khelll

    2

    Và một số tài liệu bạn đang tìm kiếm:

    16
    divs = value.css('div[id^="para-"]') 
    
    +0

    đây là trình tiết kiệm cuộc sống – Onichan

    1
    Nokogiri::XML::Node.send(:define_method, 'xpath_regex') { |*args| 
        xpath = args[0] 
        rgxp = /\/([a-z]+)\[@([a-z\-]+)~=\/(.*?)\/\]/ 
        xpath.gsub!(rgxp) { |s| m = s.match(rgxp); "/#{m[1]}[regex(.,'#{m[2]}','#{m[3]}')]" } 
        self.xpath(xpath, Class.new { 
        def regex node_set, attr, regex 
         node_set.find_all { |node| node[attr] =~ /#{regex}/ } 
        end 
        }.new) 
    } 
    

    Cách sử dụng:

    divs = Nokogiri::HTML(page.root.to_html). 
        xpath_regex("//div[@class~=/axtarget$/]//div[@class~=/^carbo/]") 
    

     Các vấn đề liên quan

    • Không có vấn đề liên quan^_^