TX *_*X T 1 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>
Run Code Online (Sandbox Code Playgroud)
在我发布上述问题之后,我了解到我可以做到这些,但看起来并不干净:
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}"
Run Code Online (Sandbox Code Playgroud)
我现在的问题是为什么html.xpath("// span/text()[contains(.,'Buyer')]")返回TEXT本身而不是ELEMENT.再次,谢谢!
<br>
在处理 HTML 时,这是一个独特的问题。除了格式化页面中的内容之外,它们实际上并没有用于任何其他用途,即像 *nix 文本文件中的换行符一样换行。因此,在提取文本时处理它们时,我的策略是将它们转换为换行符。
将内容解析为 Nokogiri::HTML 文档:
doc = Nokogiri::HTML(html_doc_to_parse)
Run Code Online (Sandbox Code Playgroud)
将其转换<br>
为换行符:
doc.search('br').each { |br| br.replace("\n") }
Run Code Online (Sandbox Code Playgroud)
然后,找到您想要的单元格:
doc.search('//td').map{ |td| td.content }
Run Code Online (Sandbox Code Playgroud)
这将返回类似以下内容:
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"]
Run Code Online (Sandbox Code Playgroud)
打印时看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
从那里开始,确定所需的正确数组元素,然后在换行符上进行拆分,即String.split("\n")
.
这是一个简洁的方法:
name, nick, email, *addr = doc.search('//td/text()[preceding-sibling::br]')
puts name, nick, email, "--", addr
Run Code Online (Sandbox Code Playgroud)
XPath完全按照你的说法执行:它接下来的所有文本节点br
.地址被分成一个变量,但如果需要,可以单独获取组件.
输出:
FirstName LastName
NickName
First.Last@SomeCompany.com
--
FirstName LastName
Attn: FirstName
1234 Main St.
TheCity, TheState, 12345
United States
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3489 次 |
最近记录: |