Ruby:我如何解析链接与Nokogiri内容/文本都一样



我要做的是:从网站(http://nytm.org/made-in-nyc)解析链接,所有的内容都完全相同。"(招聘)"然后,我将把链接列表写入"jobs.html"文件。(如果发布这些网站是违法的,我会迅速删除直接URL。我想它可能对我正在努力做的事情有帮助。第一次在栈上发帖)

DOM结构:

<article>
<ol>
<li><a href="http://www.waywire.com" target="_self" class="vt-p">#waywire</a></li>
<li><a href="http://1800Postcards.com" target="_self" class="vt-p">1800Postcards.com</a</li>
<li><a href="http://www.adafruit.com/" target="_self" class="vt-p">Adafruit Industries</a></li>
<li><a href="http://www.adafruit.com/jobs/" target="_self" class="vt-p">(hiring)</a</li>

等等……

我已经试过了:

require 'nokogiri'
require 'open-uri'
def find_jobs
   doc = Nokogiri::HTML(open('http://nytm.org/made-in-nyc'))
   hire_links = doc.css("a").select{|link| link.text == "(hiring)"}
   results = hire_links.each{|link| puts link['href']}
 begin
   file = File.open("./jobs.html", "w")
   file.write("#{results}") 
 rescue IOError => e
 ensure
   file.close unless file == nil
 end
puts hire_links
end
find_jobs

这里是一个要点

结果示例:[344] #<Nokogiri::XML::Element:0x3fcfa2e2276c name="a" attributes=[#<Nokogiri::XML::Attr:0x3fcfa2e226e0 name="href" value="http://www.zocdoc.com/careers">, #<Nokogiri::XML::Attr:0x3fcfa2e2267c name="target" value="_blank">] children=[#<Nokogiri::XML::Text:0x3fcfa2e1ff1c "(hiring)">]>

所以它成功地将这些条目写入jobs.html文件,但它是XML格式的?不知道如何目标只是值,并创建一个链接,从。不知道该往哪走。谢谢!

问题在于如何定义resultsresults是Nokogiri::XML::Element:

的数组。
results = hire_links.each{|link| puts link['href']}
p results.class
#=> Array
p results.first.class
#=> Nokogiri::XML::Element

当您将Nokogiri::XML::元素写入文件时,您将得到检查它的结果:

puts results.first.inspect
#=> "#<Nokogiri::XML::Element:0x15b9694 name="a" attributes=...."

如果您想要每个链接的href属性,您应该在结果中收集它:

results = hire_links.map{ |link| link['href'] }

假设您希望每个href/link在文件中显示为一行,您可以连接数组:

File.write('./jobs.html', results.join("n"))
修改后的脚本:
require 'nokogiri'
require 'open-uri'
def find_jobs
  doc = Nokogiri::HTML(open('http://nytm.org/made-in-nyc'))
  hire_links = doc.css("a").select { |link| link.text == "(hiring)"}
  results = hire_links.map { |link| link['href'] }       
  File.write('./jobs.html', results.join("n"))
end
find_jobs
#=> produces a jobs.html with:
#=> http://www.20x200.com/jobs/
#=> http://www.8coupons.com/home/jobs
#=> http://jobs.about.com/index.html   
#=> ...

尝试使用Mechanize。它利用了Nokogiri,你可以做一些像

require 'mechanize'
browser = Mechanize.new
page = browser.get('http://nytm.org/made-in-nyc')
links = page.links_with(text: /(hiring)/)

然后你将有一个数组的链接对象,你可以得到任何你想要的信息。您也可以使用Mechanize提供的link.click方法。

相关内容

  • 没有找到相关文章

最新更新