我要做的是:从网站(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格式的?不知道如何目标只是值,并创建一个链接,从。不知道该往哪走。谢谢!
问题在于如何定义results
。results
是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
方法。