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')]") 返回 TEXT 本身而不是 ELEMENT。再次,谢谢!!

4

2 回答 2

5

这是一个简洁的方法:

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

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

XPath 完全按照您所说的那样做:它采用br. 该地址被放入一个变量中,但如果需要,您可以单独获取组件。

输出:

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