html - Nokogiri Xpath 在 <TD> 和 <SPAN> 内检索 <BR> 之后的文本

标签 html ruby xpath nokogiri

我有以下 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')]") 返回文本本身而不是元​​素。再次感谢!!

最佳答案

这里有一个简洁的方法:

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

关于html - Nokogiri Xpath 在 <TD> 和 <SPAN> 内检索 <BR> 之后的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10019711/

相关文章:

html - 我的 CSS 和 HTML 文件无法相互正确通信

javascript - Jquery 添加表单,适用于 JSFiddle,但在生产中不起作用

html - 如何更改纸徽章中标签的字体大小?

ruby-on-rails - 对同一组数据进行多次计算 : ruby or database?

ruby-on-rails - "require File.dirname(__FILE__)"-- 如何安全地解除文件系统依赖?

xpath - XQuery - 如何对一组值使用 eq (=)

php - 如何使用 XPath 选择该元素末尾的文本?

javascript - RegExp - 替换搜索中的 `html` 标签并突出显示

ruby-on-rails - 在 Rails 模型/表中验证 presense 与 null false

java - 为什么 dom4j 仅在我的测试环境中针对有效的 XPath 抛出 InvalidXPathException?