Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Nokogiri和Ruby从带有嵌套表的HTML中提取值?_Ruby_Nokogiri_Mechanize - Fatal编程技术网

如何使用Nokogiri和Ruby从带有嵌套表的HTML中提取值?

如何使用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

我正试图从我与Nokogiri解析的页面中提取姓名、ID、电话、电子邮件、性别、种族、出生日期、班级、专业、学校和GPA

我尝试了一些不同的xpath,但我尝试的所有东西都比我想要的多得多:

<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:)很高兴能帮上忙。