如何在Nokogiri中使用条件判断?缺失锚标签时填充“No Url Found”
解决Nokogiri解析HTML表格时文本与URL数量不匹配的问题
我懂你现在的困扰——提取的文本有50条,但单独抓的href只有47条,因为部分里根本没有锚标签,这直接导致后续数据对应错位。咱们可以通过在遍历的过程中加入条件判断来搞定这个问题,同时保证文本和URL列表的数量完全匹配。
Nokogiri中的条件判断核心用法
在处理每个节点时,我们可以用at_css('a')来检查当前下是否存在子级标签:
基于这个返回值,我们就能用Ruby的条件逻辑(if-else或者更简洁的三元运算符)来决定是取真实的href,还是填充我们指定的默认值。
完整解决方案代码
不再分开提取所有文本和所有URL,而是逐个处理每个目标节点,这样每个文本都会对应一个URL(要么是真实链接,要么是默认填充值):
# 遍历你需要处理的<td>集合(这里根据你的代码,假设是nth-child(1)的<td>) page.css("td:nth-child(1)").each do |td| # 提取<td>的文本内容,和之前的逻辑一致 company_name = td.text.strip # 检查当前<td>是否包含<a>标签 anchor_tag = td.at_css('a') # 条件判断:存在锚标签则取href,否则填充默认值 directory_url = if anchor_tag anchor_tag['href'] else "No Url Found" end # 输出结果(也可以存入数组供后续使用) puts "公司名称: #{company_name}, 链接: #{directory_url}" end
如果喜欢更简洁的写法,可以用三元运算符替换if-else:
page.css("td:nth-child(1)").each do |td| company_name = td.text.strip anchor_tag = td.at_css('a') directory_url = anchor_tag ? anchor_tag['href'] : "No Url Found" puts "公司名称: #{company_name}, 链接: #{directory_url}" end
存入数组的版本(方便后续处理)
如果需要把结果存入数组,保证两个数组长度完全匹配:
company_names = [] directory_urls = [] page.css("td:nth-child(1)").each do |td| company_names << td.text.strip anchor_tag = td.at_css('a') directory_urls << (anchor_tag ? anchor_tag['href'] : "No Url Found") end # 验证数量是否一致 puts "文本总数: #{company_names.length}" puts "URL总数: #{directory_urls.length}"
这样处理后,不管里有没有锚标签,company_names和directory_urls的长度都会完全一致,再也不会出现错位的问题了。
内容的提问来源于stack exchange,提问作者Ruel Nopal
相关产品推荐
相关产品推荐

