如何使用Nokogiri和Ruby从带有嵌套表的HTML中提取值?
我正试图从我与Nokogiri解析的页面中提取姓名、ID、电话、电子邮件、性别、种族、出生日期、班级、专业、学校和GPA 我尝试了一些不同的xpath,但我尝试的所有东西都比我想要的多得多:如何使用Nokogiri和Ruby从带有嵌套表的HTML中提取值?,ruby,nokogiri,mechanize,Ruby,Nokogiri,Mechanize,我正试图从我与Nokogiri解析的页面中提取姓名、ID、电话、电子邮件、性别、种族、出生日期、班级、专业、学校和GPA 我尝试了一些不同的xpath,但我尝试的所有东西都比我想要的多得多: <span class="subTitle"><b>Recruit Profile</b></span> <br><table border="0" width="100%"><tr> <td> &l
<span class="subTitle"><b>Recruit Profile</b></span>
<br><table border="0" width="100%"><tr>
<td>
<table bgcolor="#afafaf" border="0" cellpadding="0" width="100%">
<tr>
<td>
<table bgcolor="#cccccc" border="0" cellpadding="2" cellspacing="2" width="100%">
<tr>
<td bgcolor="#dddddd"><b>Name</b></td>
<td bgcolor="#dddddd">Some Person</td>
</tr>
<tr>
<td bgcolor="#dddddd"><b>EDU ID</b></td>
<td bgcolor="#dddddd">A12345678</td>
</tr>
<tr>
<td bgcolor="#dddddd"><b>Phone</b></td>
<td bgcolor="#dddddd">123-456-7890</td>
</tr>
<tr>
<td bgcolor="#dddddd"><b>Address</b></td>
<td bgcolor="#dddddd">1234 Somewhere Dr.<br>City ST, 12345</td>
</tr>
<tr>
<td bgcolor="#dddddd"><b>Email</b></td>
<td bgcolor="#dddddd">someone@email.com</td>
</tr>
<tr>
<td bgcolor="#dddddd"><b>Gender</b></td>
<td bgcolor="#dddddd">Female</td>
</tr>
<tr>
<td bgcolor="#dddddd"><b>Ethnicity</b></td>
<td bgcolor="#dddddd">Unknown</td>
</tr>
<tr>
<td bgcolor="#dddddd"><b>Date of Birth</b></td>
<td bgcolor="#dddddd">Jan 1st, 1901</td>
</tr>
<tr>
<td bgcolor="#dddddd"><b>Class</b></td>
<td bgcolor="#dddddd">Sophomore</td>
</tr>
<tr>
<td bgcolor="#dddddd"><b>Major</b></td>
<td bgcolor="#dddddd">Biology</td>
</tr>
<tr>
<td bgcolor="#dddddd"><b>School</b></td>
<td bgcolor="#dddddd">University of Somewhere</td>
</tr>
<tr>
<td bgcolor="#dddddd"><b>GPA</b></td>
<td bgcolor="#dddddd">0.00</td>
</tr>
<tr>
<td bgcolor="#dddddd" valign="top"><b>Availability</b></td>
<td bgcolor="#dddddd">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
招募档案
名称
某人
教育ID
A12345678
电话
123-456-7890
地址
1234某处城市街12345号
电子邮件
someone@email.com
性别
女性
种族渊源
不为人知
出生日期
1901年1月1日
等级
大二
专业
生物
学校
某地大学
平均成绩
0
可利用性
我假设将有许多“招聘档案”跨度,后面是总结所有细节的表格。以下方法获取整个HTML页面,只查找这些跨距,并为每个跨距查找下表,然后在该表下的任意位置查找所需的字段:
require 'nokogiri'
# Pass in or set the array of labels you want to use
# Returns an array of hashes mapping these labels to the values
def recruits_details(html,fields=%W[Name #{"EDU ID"} Phone Email Gender])
doc = Nokogiri::HTML(html)
recruit_labels = doc.xpath('//span[b[text()="Recruit Profile"]]')
recruit_labels.map do |recruit_label|
recruit_table = recruit_label.at_xpath('following-sibling::table')
Hash[ fields.map do |field_label|
label_td = recruit_table.at_xpath(".//td[b[text()='#{field_label}']]")
[field_label, label_td.at_xpath('following-sibling::td/text()').text ]
end ]
end
end
require 'pp'
pp recruits_details(html_string)
#=> [{"Name"=>"Some Person",
#=> "EDU ID"=>"A12345678",
#=> "Phone"=>"123-456-7890",
#=> "Email"=>"someone@email.com",
#=> "Gender"=>"Female"}]
类似于//foo[bar[text()=“jim”]]
的XPath表达式表示:
- 在当前节点下的任意位置查找“foo”元素
- …但仅当它具有作为子元素的“bar”元素时
- …但前提是“bar”元素的内容为文本“jim”
的XPath表达式following sibling::…
意味着查找与表达式…
匹配的当前节点后的同级元素
XPath表达式../text()
选择;text
方法用于提取该文本节点的值(实际字符串)
Nokogiri的方法返回与表达式匹配的所有元素的数组,而该方法返回与表达式匹配的第一个元素。+!出色的工作,包括您需要解析的实际HTML示例。感谢您的快速响应!我很快就要开始测试了!非常感谢你,经过一些黑客攻击,我让它工作得很好!谢谢正如你所知,如果你有一个歌迷俱乐部,我会成为总统。@Sean:)很高兴能帮上忙。