Я анализирую веб-страницу с помощью Nokogiri и хочу разобрать URL-адрес изображения. Это моя установка:
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(open('https://themeforest.net/search?sort=sales'))
Я вижу следующий блок кода, если просматриваю страницу в хроме:
<div class="_2_3rp " style="padding-top:50.847457627118644%">
<div style="">
<img class="_1xvs1" src="https://themeforest.img.customer.envatousercontent.com/files/274559780/screenshots/00-Preview.jpg?auto=compress%2Cformat&fit=crop&crop=top&w=590&h=300&s=37354d884fd0f3b574238e013b4ea423"
title="Avada | Responsive Multi-Purpose Theme"
alt="Avada | Responsive Multi-Purpose Theme" style="left: 0%;">
</div>
</div>
Однако когда я бегу:
puts doc.search("//div[@class = '_2_3rp ']")
Получаю следующее:
<div class="_2_3rp " style="padding-top:50.847457627118644%"><div style="height:100%" class="lazyload-placeholder"></div></div>
<div class="_2_3rp " style="padding-top:50.847457627118644%"><div style="height:100%" class="lazyload-placeholder"></div></div>
.....
=> nil
Почему я не получаю класс img
, а вместо этого получаю lazyload-placeholder
? Есть ли способ преодолеть это и избежать заполнителя изображения?
1 ответ
Вот минимальный код, который я придумал, необходимый для проверки вашего утверждения:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<div class="12345">
<div>
<img class="67890" src="https://foo.bar">
</div>
</div>
EOT
doc.search('//div[@class=12345]').map(&:to_html)
# => ["<div class=\"12345\">\n" +
# " <div>\n" +
# " <img class=\"67890\" src=\"https://foo.bar\">\n" +
# " </div>\n" +
# "</div>"]
# "</div>"]
Похоже, что тег img
есть.
Вы используете Nokogiri::XML
для разбора. Не делайте этого, потому что происходит строгий синтаксический анализ, а с HTML, который не является строгим, могут возникнуть проблемы, если HTML искажен.
Nokogiri::HTML
дал тот же результат.
Похожие вопросы
Новые вопросы
ruby
Ruby - это многоплатформенный динамический объектно-ориентированный интерпретируемый язык с открытым исходным кодом. Тег [ruby] предназначен для вопросов, связанных с языком Ruby, включая его синтаксис и его библиотеки. Вопросы Ruby on Rails должны быть помечены [ruby-on-rails].
div
style
отличается.