Ruby Nokogiri Scraper не может удалить теги HTML h1 - PullRequest
0 голосов
/ 30 ноября 2018

Я чувствую себя глупо, потому что это кажется таким легким.Но я застрял с этим:

Я построил скребок, который дает мне звания рабочих мест.Прекрасно работает, но включает в себя теги h1.Например, он сохраняет название задания как:

"<<em> h1> Менеджер по маркетингу <</em> / h1>" Я не знаю, почему он не просто принимает значение в теге h1.

Но во-вторых, я просто попытался убрать теги, удалив первые 4 и последние 5 символов заголовка (title (4 ..- 5). К сожалению, похоже, что такая функция, как strip, не работает (ошибкаговорит мне, что это какой-то странный класс нокогири, который нельзя удалить).

Итак, вот мой код, надеюсь, кто-то знает разумное решение для моей проблемы:

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 голосов
/ 01 декабря 2018

Это дает вам кучу элементов:

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

Это дает вам текст первого:

job_title = html_doc.at('.job-detail-desc h1').text
0 голосов
/ 01 декабря 2018

Проблема в том, что 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

0 голосов
/ 30 ноября 2018

Для HTML практическое правило состоит в том, что документы имеют теги html и body, а фрагменты обычно не имеют.Попробуйте использовать класс DocumentFragment, поскольку текст не является допустимым документом HTML или XML.

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