我在 Ruby 中使用 Nokogiri gem 时遇到了一些问题。
我想从网页上抓取地址,地址的显示方式没有固定格式。
我有一个邮政编码列表,我希望我的 Ruby 脚本返回包含邮政编码的节点,以便我可以找到地址的其余部分。
这是我在 Ruby 中得到的,带有一些示例 HTML 内容:
require 'nokogiri'
require 'open-uri'
content1 = '
<div>
<div>
<div>Our Address:</div>
1 North Street
North Town
North County
N21 4DD
</div>
</div>'
doc = Nokogiri::HTML(content1)
result = doc.search "[text()*='N21 4DD']"
puts result.inspect
返回 []
我知道上面的示例是地址在 HTML 中出现的一种奇怪方式,但这是我可以显示我遇到的问题的最简单方式。这是另一个 content
什么都不返回的变量:
content1 = '
<div>
<div>Our Address:</div>
<div>
1 North Street<br>
North Town<br>
North County<br>
N21 4DD
</div>
</div>'
我知道 Nokogiri 可能会遇到上述问题,因为 <br>
标签应该是 </br>
但这在网站上很常见。
这个例子有效:
content1 = '
<div>
<div>Our Address:</div>
<div>
1 North Street
North Town
North County
N21 4DD
</div>
</div>'
有人能解释一下为什么从前两个 content
找不到节点吗?上面的示例以及如何解决这个问题?
我不是在寻找可以在示例 content
中找到邮政编码的自定义解决方案上面的例子——这些只是为了演示目的。邮政编码(和地址)可以在 html 中的任何位置 – body
, p
, div
, td
, span
, li
等等
谢谢。
最佳答案
使用 Xpath:
doc.xpath('.//div[contains(.,"N21 4DD")]')
这仍然返回两个节点,因为有一个嵌套的 div。我不确定是否有办法在没有“我们的地址”div 的情况下获取中间 div,因为它位于同一节点中。
关于Ruby Nokogiri 文本搜索不适用于 br 标签和其他标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45019148/