请参阅以下层次结构:
我所需要的只是"公司名称","公司所有者","公司所有者标题","街道号码街道名称" ,和"城市,州邮政编码"。
我尝试了b.div.span.bs
,但这不起作用(bs
,因为我收集了多个数据块)。我还以为我只是尝试b.tds.split('<br>')
之类的东西然后替换所有标签实例并以某种方式删除空的数组单元格,但我发现每个块都不同,因此数据不对齐,也就是说,公司标题可能在第一个阵列的单元格1中,但如果公司标题不存在(对于第二个区块),那么单元格1将是公司所有者,这是冲突的......无论如何,只是尝试找到一种获取这些数据的聪明方法。谢谢。
Here是实际的HTML;但是您必须先点击&#34;查看全部&#34;。
答案 0 :(得分:1)
您可以拆分<div>
内的所有内容,然后按<br>
拆分。第一部分是公司名称(如果存在),然后公司所有者是最后一秒。
其余的......比较棘手。传真和会员中的一些非常直接因为有标签所以这些很容易。 <a>
很简单。
您可以使用正则表达式测试电话号码,然后从那里备份。如果电话号码前的那个不是<a>
那么它是城市,州拉链和之前的那个是地址。如果之前存在,则为公司所有者标题。
示例中的电话号码后面的所有内容都有标签,因此很容易。
答案 1 :(得分:1)
我不确定你的所有用例,但是经常用于DOM不太有用的页面我只是得到文本并用Ruby解析:
browser.td.text.split("\n").reject(&:empty?)
答案 2 :(得分:1)
这并没有直接回答这个问题,但它显示了我是如何使用Nokogiri进行此操作的,Nokogiri是Ruby的标准HTML / XML解析器:
require 'nokogiri'
doc = Nokogiri::HTML('<td><div></div><br>a<br>b<br>c</td>')
doc
是Nokogiri在该文档中的内部代表。
我们在标记中使用地标来导航和查找我们想要的东西。在这种情况下,<div>
是一个很好的起点:
doc.at('div').next_sibling.next_sibling.text # => "a"
next_sibling
是我们告诉Nokogiri查看下一个节点的方法。在这种情况下,它会跳过第一个<br>
并查看a
TextNode。
但这导致代码不可行,所以还有更好的方法:
doc.search('td br').to_html # => "<br><br><br>"
这表明我们可以在<br>
内找到所有<td>
标签,因此我们只需迭代它们并将它们用作我们的地标:
doc.search('td br').map{ |br| br.next_sibling.text } # => ["a", "b", "c"]