引入nokogiri XPath来检索文本之后 内 和(Nokogiri Xpath to

2019-07-28 20:13发布

我有以下的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(“//跨度/文()[含(‘买家’)]”)返回文本本身,而不是元素。 再次感谢!

Answer 1:

这里有一个简洁的方法:

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


Answer 2:

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



文章来源: Nokogiri Xpath to retrieve text after
within and