2010-03-20 10 views
2

Je dois extraire le numéro de téléphone du formulaire HTML ci-dessous, mais je ne suis pas sûr de savoir comment le faire en utilisant Nokogiri CSS puisqu'il n'y a pas de balises html. Quand un at_css (.phonetitle), il analyse seulement le téléphone et non le numéro.Analyser les données sans balises HTML

<div class="detail"> 
    <span class="address">Corner of Toorak Road and Chapel Street, South Yarra</span><br> 
    <span class="phonetitle">Phone</span> 95435 34341 
    <br><br> 
</div> 

Répondre

0

Rien un peu XPath ne peut pas gérer:

#!/usr/bin/env ruby 
require 'nokogiri' 

doc = Nokogiri::HTML(<<-HERE) 
    <div class="detail"> 
    <span class="address"> 
     Corner of Toorak Road and Chapel Street, South Yarra 
    </span><br> 
    <span class="phonetitle">Phone</span> 95435 34341 
    <br><br> 
    </div> 
HERE 

puts doc.search('*[@class="detail"]/text()').text.strip 
# => 95435 34341 
-1

C'est une chose très difficile à analyser facilement car il n'y a pas d'enveloppe claire autour du numéro de téléphone lui-même. Ce n'est pas dans son propre ou.

Si vous avez tout le contenu en javascript, je suppose que vous pourriez le décomposer en utilisant la méthode split().

var string = '<div class="detail"> 
    <span class="address">Corner of Toorak Road and Chapel Street, South Yarra</span><br> 
    <span class="phonetitle">Phone</span> 95435 34341 
    <br><br> 
</div>'; 

var a = string.split('Phone</span>'); 
var b = string.split('<br>',a[1]); 
return b[0]; 
0

Essayez ceci:

public static final int MAX_HTML_TAG_LENGTH = 10; 
public static final String[] REGEX_HTTP_TAG_FILTER = new String[] { 
      "[\\t\\n\\r\\f]+", 
      "<(s|S)(c|C)(r|R)(i|I)(p|P)(t|T)[^>]*>.+?</(s|S)(c|C)(r|R)(i|I)(p|P)(t|T)>", 
      "<(s|S)(t|T)(y|Y)(l|L)(e|E)[^>]*>.+?</(s|S)(t|T)(y|Y)(l|L)(e|E)>", 
      "<[a-zA-Z]{1," + MAX_HTML_TAG_LENGTH + "}\\s*[^>]*>", 
      "</[a-zA-Z]{1," + MAX_HTML_TAG_LENGTH + "}>", "<!--.+?-->", 
      "&nbsp;", 
      "[ ]{2,}+" 
}; 

for (int i = 0; i < REGEX_HTTP_TAG_FILTER.length; i++) { 
      result = result.replaceAll(REGEX_HTTP_TAG_FILTER[i], " "); 
} 
0

est ici l'expression XPath pour trouver le numéro de téléphone:

*[@class='phonetitle']/following-sibling::text() 

Exemple en Python (vous pouvez le porter sur Ruby et nokogiri en utilisant @Jörg W Mittag's answer):

#!/usr/bin/env python 
from lxml import html 

doc = html.fromstring(""" 
    <div class="detail"> 
    <span class="address"> 
     Corner of Toorak Road and Chapel Street, South Yarra 
    </span><br> 
    <span class="phonetitle">Phone</span> 95435 34341 
    <br><br> 
    </div> 
""") 

pn, = doc.xpath("*[@class='phonetitle']/following-sibling::text()") 
print pn.strip() 
# -> 95435 34341