3

Nokogiri(Ruby上)を使用して解析しようとしている非常に裸のHTMLがいくつかあります。

<span>Address</span><br />
123 Main Street<br />
Sometown<br />
<span>Telephone</span><br />
<a href="tel:212-555-555">212-555-555</a><br />

    <span>Hours</span><br />
    M-F: 8:00-21:00<br />
       Sat-Sun: 8:00-21:00<br />
<hr />

<div>私が持っている唯一のタグは、ページコンテンツの周囲です。私が欲しいもののそれぞれの前に<span>Address</span>タイプタグがあります。最後に別のspanまたはahrを続けることができます。

住所( "123 Main Street \ nSometown")、電話番号( "212-555-555")、営業時間を別々のフィールドとして表示したいと思います。

のこぎりを使って情報を引き出す方法はありますか、それとも正規表現を使った方が簡単ですか?

4

2 に答える 2

5

Nokogiri と XPathを使用すると、次のようなことができます。

def extract_span_data(html)
  doc = Nokogiri::HTML(html)
  doc.xpath("//span").reduce({}) do |memo, span|
    text = ''
    node = span.next_sibling
    while node && (node.name != 'span')
      text += node.text
      node = node.next_sibling
    end
    memo[span.text] = text.strip
    memo
  end
end

extract_span_data(html_string)
# {
#   "Address"   => "123 Main Street\nSometown",
#   "Telephone" => "212-555-555",
#   "Hours"     => "M-F: 8:00-21:00\n       Sat-Sun: 8:00-21:00"
# }

適切なパーサーを使用することは、正規表現を使用するよりも簡単で堅牢です (これはよく文書化された悪い考えTMです)。

于 2013-02-13T20:09:42.040 に答える
0

私はxpathについて(むしろ学んで)考えていました:

d.xpath("span[2]/preceding-sibling::text()").each {|i| puts i}
# 123 Main Street
# Sometown

d.xpath("a/text()").text
# "212-555-555"

d.xpath("span[3]/following::text()").text.strip
# "M-F: 8:00-21:00       Sat-Sun: 8:00-21:00"

最初は 2 番目のスパンから始まり、前にある text() を選択します。
ここで別のアプローチを試すことができます-最初のスパンから始めて、text() を選択し、次のスパンをチェックする述語で終わります。

d.xpath("span[1]/following::text()[following-sibling::span]").each {|i| puts i}
# 123 Main Street
# Sometown

ドキュメントにさらにスパンがある場合は、正しいスパンから始めることができます: ==
span[x]で置き換えることができますspan[contains(.,'text-in-span')]
span[3]span[contains(.,'Hours')]

何かが本当に間違っている場合は、私を修正してください。

于 2013-02-13T22:55:32.930 に答える