加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用Nokogiri和Ruby从嵌套表中删除HTML中的值?

发布时间:2020-12-17 03:12:56 所属栏目:百科 来源:网络整理
导读:我试图从我正在使用Nokogiri解析的页面中提取姓名,ID,电话,电子邮件,性别,种族,DOB,班级,专业,学校和GPA. 我尝试了一些不同的xpath,但我尝试抓取的东西比我想要的要多得多: span class="subTitle"bRecruit Profile/b/spanbrtable border="0" width="100%"tr
我试图从我正在使用Nokogiri解析的页面中提取姓名,ID,电话,电子邮件,性别,种族,DOB,班级,专业,学校和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>

解决方法

我假设会有很多“Recruit Profile”跨度,后面跟着包含所有细节的表格.以下方法将获取整个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表达式,如follow-sibling :: …表示查找当前节点之后与表达式匹配的兄弟元素…

XPath表达式… / text()选择Text node; text方法用于提取该文本节点的值(实际字符串).

Nokogiri的xpath方法返回与表达式匹配的所有元素的数组,而at_xpath方法返回与表达式匹配的第一个元素.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读