如何使用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’元素 一个XPath表达式,如follow-sibling :: …表示查找当前节点之后与表达式匹配的兄弟元素… XPath表达式… / text()选择Text node; text方法用于提取该文本节点的值(实际字符串). Nokogiri的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |