Разбор данных без тегов HTML - PullRequest
2 голосов
/ 20 марта 2010

Мне нужно извлечь фактический номер телефона из HTML, перечисленного ниже, но я не совсем уверен, как это сделать с помощью Nokogiri CSS, поскольку вокруг него нет HTML-тегов. При at_css (.phonetitle) он только анализирует телефон, а не номер.

<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>

Ответы [ 4 ]

0 голосов
/ 20 марта 2010

Вот выражение XPath для поиска номера телефона:

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

Пример на Python (вы можете перенести его на Ruby и nokogiri, используя @ 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
0 голосов
/ 20 марта 2010

Ничего, с чем XPath не может справиться:

#!/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
0 голосов
/ 20 марта 2010

Попробуйте это:

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 голосов
/ 20 марта 2010

Это очень сложно разобрать, потому что вокруг самого телефонного номера нет четкой обертки. Это не само по себе или.

Если вы включили все это в javascript, я думаю, вы могли бы разбить его, используя метод 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];
...