1

私は次のhtmlを持っており、xpathを使用してすべての情報を取得する方法を知りたいです:-名前(最初、最後)-ニックネーム-電子メール-配送先住所...

主に、の後にテキストを取得します<BR>。よろしくお願いします。

<table>
<tr>
<td valign="top" width="50%" align="left">
<span>Buyer</span><br/>FirstName LastName<br/>NickName<br/>First.Last@SomeCompany.com</td>

<tr><td valign="top" width="40%" align="left">
<span><span>Shipping address - </span><span>confirmed</span></span><br/>FirstName LastName<br/>Attn: FirstName<br/>1234 Main St.<br/>TheCity, TheState, 12345<br/>United States<br/></td>
</tr></table>

上記の質問を投稿した後、私はこれらを行うことができることを学びましたが、きれいに見えません:

buyer = html.xpath("//span/text()[contains(., 'Buyer')]").first.parent 
buyer_name = buyer.next.next 
puts "Buyer's Full name: #{buyer_name.text}" 
buyer_nick = buyer_name.next.next 
puts "Buyer's Nick name: #{buyer_nick.text}" 
buyer_email = buyer_nick.next.next 
puts "Buyer's email: #{buyer_email.text}" 

私の質問は、html.xpath( "// span / text()[contains(。、'Buyer')]")がELEMENTではなくTEXT自体を返す理由です。もう一度、ありがとう!

4

2 に答える 2

5

簡潔な方法は次のとおりです。

name, nick, email, *addr = doc.search('//td/text()[preceding-sibling::br]')

puts name, nick, email, "--", addr

XPathは、あなたが述べたことを正確に実行します。.に続くすべてのテキストノードを取りますbr。アドレスは1つの変数にまとめられますが、必要に応じてコンポーネントを個別に取得できます。

出力:

FirstName LastName
NickName
First.Last@SomeCompany.com
--
FirstName LastName
Attn: FirstName
1234 Main St.
TheCity, TheState, 12345
United States
于 2012-04-05T00:06:00.310 に答える
4

<br>HTMLを扱う場合、少し独特の問題があります。これらは実際にはページのコンテンツをフォーマットする以外には使用されません。つまり、*nixテキストファイルの改行のように改行します。したがって、テキストを抽出しながらそれらを処理するときの私の戦術は、それらを新しい行に変換することです。

コンテンツをNokogiri::HTMLドキュメントに解析します。

doc = Nokogiri::HTML(html_doc_to_parse)

<br>新しい行に変換します。

doc.search('br').each { |br| br.replace("\n") }

次に、必要なセルを見つけます。

doc.search('//td').map{ |td| td.content } 

これは次のようなものを返します:

doc.search('//td').map(&:content)
=> ["\n  Buyer\nFirstName LastName\nNickName\nFirst.Last@SomeCompany.com",
 "\n  Shipping address - confirmed\nFirstName LastName\nAttn: FirstName\n1234 Main St.\nTheCity, TheState, 12345\nUnited States\n"]

印刷すると次のようになります。

puts doc.search('//td').map(&:content)

  Buyer
FirstName LastName
NickName
First.Last@SomeCompany.com

  Shipping address - confirmed
FirstName LastName
Attn: FirstName
1234 Main St.
TheCity, TheState, 12345
United States

そこから、必要な正しい配列要素を決定し、新しい行で分割する場合がありますString.split("\n")

于 2012-04-04T22:30:47.267 に答える