gpt4 book ai didi

ruby-on-rails - ROR/Hpricot : parsing a site and searching/comparing strings with regex

转载 作者:太空宇宙 更新时间:2023-11-03 16:06:25 24 4
gpt4 key购买 nike

我刚开始使用 Ruby On Rails,想创建一个简单的网站爬虫:

  1. 浏览所有 Sherdog 战士的资料。
  2. 获取裁判的姓名。
  3. 将名称与旧名称进行比较(在站点解析期间和从文件中)。
  4. 打印所有唯一名称并将其保存到文件中。

一个示例 URL 是:http://www.sherdog.com/fighter/Fedor-Emelianenko-1500

我正在搜索类似 <span class="sub_line">Dan Miragliotta</span> 的标签条目, 不幸的是,除了我需要的正确 Referee 名称之外,相同类型的类还用于:

  1. 日期。
  2. “N/A”表示裁判姓名未知。

我需要丢弃所有带有“N/A”字符串的结果以及任何包含数字的字符串。我设法做了第一部分,但不知道如何做第二部分。我尝试搜索、思考和试验,但在试验和重写之后,设法破坏了整个程序并且不知道如何(正确地)修复它:

require 'rubygems'
require 'hpricot'
require 'simplecrawler'

# Set up a new crawler
sc = SimpleCrawler::Crawler.new("http://www.sherdog.com/fighter/Fedor-Emelianenko-1500")
sc.maxcount = 1
sc.include_patterns = [".*/fighter/.*$", ".*/events/.*$", ".*/organizations/.*$", ".*/stats/fightfinder\?association/.*$"]

# The crawler yields a Document object for each visited page.
sc.crawl { |document|
# Parse page title with Hpricot and print it
hdoc = Hpricot(document.data)

(hdoc/"td/span[@class='sub_line']").each do |span|
if span.inner_html == 'N/A' || Regexp.new(".*/\d\.*$").match(span.inner_html)
# puts "Test"
else
puts span.inner_html
#File.open("File_name.txt", 'a') {|f| f.puts(hdoc.span.inner_html) }
end
end
}

我也很感激对程序其余部分的想法的帮助:如果程序运行多次,我如何从文件中正确读取当前名称,以及如何比较唯一名称?


编辑:

经过一些提议的改进后,这是我得到的:

require 'rubygems'
require 'simplecrawler'
require 'nokogiri'
#require 'open-uri'

sc = SimpleCrawler::Crawler.new("http://www.sherdog.com/fighter/Fedor-Emelianenko-1500")
sc.maxcount = 1

sc.crawl { |document|
doc = Nokogiri::HTML(document.data)
names = doc.css('td:nth-child(4) .sub-line').map(&:content).uniq.reject { |c| c == 'N/A' }
puts names
}

不幸的是,代码仍然不起作用 - 它返回一个空白。

如果不是 doc = Nokogiri::HTML(document.data) , 我写 doc = Nokogiri::HTML(open(document.data)) , 然后它给了我整个页面,但是,解析仍然不起作用。

最佳答案

hpricot 不再维护。如何使用 nokogiri相反?

names = document.css('td:nth-child(4) .sub-line').map(&:content).uniq.reject { |c| c == 'N/A' }
=> ["Yuji Shimada", "Herb Dean", "Dan Miragliotta", "John McCarthy"]

不同部分的分割:

document.css('td:nth-child(4) .sub-line')

这将返回一个 html 元素数组,其类名 sub-line 位于第四个表列中。

.map(&:content)

对于前面数组中的每个元素,返回element.content(内部html)。这相当于 map({ |element| element.content })

.uniq

从数组中删除重复值。

.reject { |c| c == 'N/A' }

移除值为“N/A”的元素

关于ruby-on-rails - ROR/Hpricot : parsing a site and searching/comparing strings with regex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12831250/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com