我觉得很傻,因为它看起来很简单。但我坚持这一点:
我制造了一个刮板,可以让我获得工作职位。 效果很好,但其中包含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
答案 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,经验法则是文档具有html
和body
标签,而片段通常没有。尝试使用DocumentFragment
类,因为文本不是有效的HTML或XML文档。
html_doc = Nokogiri::HTML::DocumentFragment.parse(html_file)