Ruby Nokogiri Scraper无法删除HTML h1标签

时间:2018-11-30 16:53:21

标签: ruby-on-rails ruby web-scraping nokogiri

我觉得很傻,因为它看起来很简单。但我坚持这一点:

我制造了一个刮板,可以让我获得工作职位。 效果很好,但其中包含h1标签。例如。它将职位的标题保存为:

“ << em> h1>营销经理<< / em> / h1>” 我不知道他为什么不只将h1标记中的值包含在内。

但是,第二,我只是尝试通过剥离标题的前4个字符和后5个字符(title(4 ..- 5))来剥离标签。不幸的是,似乎没有类似strip的功能起作用(错误告诉我它的一些不可剥夺的怪异的nokogiri类。

这是我的代码,希望有人知道解决我问题的聪明方法:

company_career_urls.each do |url|
  puts "gets job url"
  # get the specific job url
  html_file = open(url).read
  html_doc = Nokogiri::HTML(html_file)
  i = 0
  Vacancy.where(:companyname => "Lillydoo").destroy_all
  html_doc.search('.job-list-button a').each do |element|
    i = i+1
    if i > 7
    else
      job_url = element.attribute('href').value
      puts job_url
      #get the job name and description
      html_file = open(job_url).read
      html_doc = Nokogiri::HTML(html_file)
      job_description = html_doc.search('.inner ul')
      job_title = html_doc.search('.job-detail-desc h1') #this line seems to be the problem
      # job_title = job_title_html[4..-6]
      puts job_title

      resource_type = "image"
      type = "upload"
      version = 1234567890
      public_id = "wv7l1o6xwimtfvx2oxdw"
      format = "jpg"
      signature = Cloudinary::Utils.api_sign_request({:public_id=>public_id,
      :version=>version}, Cloudinary.config.api_secret)
      photo = "#{resource_type}/#{type}/v#{version}/#{public_id}.#{format}##{signature}"
      vacancy = Vacancy.create(title: job_title, companyname: 'Lillydoo', jobdescription: job_description, photo: photo)
    end
  end

3 个答案:

答案 0 :(得分:0)

这为您提供了一堆元素:

job_title = html_doc.search('.job-detail-desc h1')

这将为您提供第一个文本:

job_title = html_doc.at('.job-detail-desc h1').text

答案 1 :(得分:0)

您遇到的问题是job_title不是一个简单的字符串;它是一组与搜索匹配的节点对象。当您使用puts打印它时,Ruby会在节点集上调用#to_s并输出所有节点的“ HTML源代码”。

您需要做的是隔离所需的节点,然后使用#content(或#text)提取其文本内容。这是一个示例:

require 'nokogiri'

CONTENT = <<'EOT'
<html>
  <body>
    <h1>Test Heading</h1>
  </body>
</html>
EOT

html_doc = Nokogiri::HTML(CONTENT)

# this returns a set of all matching nodes
nodes = html_doc.css('h1')
puts nodes.class   # --> "Nokogiri::XML::NodeSet"
puts nodes         # --> "<h1>Test Heading<h1>"

# if you know you will only have one, use at_css
node = html_doc.at_css('h1')
puts node.class    # --> "Nokogiri::XML::Element"
puts node          # --> "<h1>Test Heading</h1>"

# to get just the text content inside the node
puts node.content  # --> "Test Heading"

请参见https://www.nokogiri.org/tutorials/searching_a_xml_html_document.html

答案 2 :(得分:-1)

对于HTML,经验法则是文档具有htmlbody标签,而片段通常没有。尝试使用DocumentFragment类,因为文本不是有效的HTML或XML文档。

html_doc = Nokogiri::HTML::DocumentFragment.parse(html_file)