当 id 包含特殊字符时,如何使用 Nokogiri 抓取 URL/text
How to scrape URL/text, when the id contains special characters using Nokogiri
我正在尝试从 https://webcat.schaeffler.com/web/schaeffler/pl/PKW/applicationSearch.xhtml 抓取一些数据。
我开始构建我的应用程序的结构:
require 'nokogiri'
require 'open-uri'
class Scrape
def first(strona)
@page = Nokogiri::HTML(open(strona))
end
def marka(css)
@page.css(css).text
end
end
x = Scrape.new
x.first("https://webcat.schaeffler.com/web/schaeffler/pl/PKW/index.xhtml")
puts x.marka("a#searchByConstraints:form:j_idt491:0:j_idt493:0:j_idt495")
它应该放 "ABARTH",但是 id
包括像 ":"
这样的特殊字符,我唯一得到的是:
unexpected '0' after ':' (Nokogiri::CSS::SyntaxError)
我在“Is there a way to escape non-alphanumeric characters in Nokogiri css?”上找到了解决方案,所以我将代码的最后一行更改为:
puts x.marka('*[id="searchByConstraints:form:j_idt491:0:j_idt493:0:j_idt495"]')
它returns一个空字符串,但我不知道为什么。
目标站点上的元素如下所示:
<a id="searchByConstraints:form:j_idt491:0:j_idt493:0:j_idt495" href="/web/schaeffler/pl/PKW/3854/applicationSearch.xhtml" title="ABARTH">ABARTH</a>
我做错了什么或者它对我不起作用。
这些 ID 是非标准的 CSS,因此您无法像搜索普通标签那样搜索它们,这类似于 <div id="this-is-normal">
。相反,您需要匹配 div 的 ID 中的模式。
我想这就是你需要的:
@page.css('div[id^="searchByConstraints:form:j_idt491"]')
所以对你来说是:
x.marka('div[id^="searchByConstraints:form:j_idt491"]')
作为旁注,我建议您将 class 命名为 Scrapper
或 Scrape
而且最好在 class 之后命名实例变量,所以
scrapper = Scrapper.new
scrapper.marka('blah') # etc. maybe you mean marker?
我已经想好如何解决了。我用 XPATH 比 CSS.
我更改此代码:
def marka(css)
@page.css(css).text
end
puts x.marka("a#searchByConstraints:form:j_idt491:0:j_idt493:0:j_idt495")
为此:
def marka(css)
@page.xpath(css).text
end
puts x.marka("//*[@id='searchByConstraints:form:j_idt491:0:j_idt493:0:j_idt495']")
我正在尝试从 https://webcat.schaeffler.com/web/schaeffler/pl/PKW/applicationSearch.xhtml 抓取一些数据。
我开始构建我的应用程序的结构:
require 'nokogiri'
require 'open-uri'
class Scrape
def first(strona)
@page = Nokogiri::HTML(open(strona))
end
def marka(css)
@page.css(css).text
end
end
x = Scrape.new
x.first("https://webcat.schaeffler.com/web/schaeffler/pl/PKW/index.xhtml")
puts x.marka("a#searchByConstraints:form:j_idt491:0:j_idt493:0:j_idt495")
它应该放 "ABARTH",但是 id
包括像 ":"
这样的特殊字符,我唯一得到的是:
unexpected '0' after ':' (Nokogiri::CSS::SyntaxError)
我在“Is there a way to escape non-alphanumeric characters in Nokogiri css?”上找到了解决方案,所以我将代码的最后一行更改为:
puts x.marka('*[id="searchByConstraints:form:j_idt491:0:j_idt493:0:j_idt495"]')
它returns一个空字符串,但我不知道为什么。
目标站点上的元素如下所示:
<a id="searchByConstraints:form:j_idt491:0:j_idt493:0:j_idt495" href="/web/schaeffler/pl/PKW/3854/applicationSearch.xhtml" title="ABARTH">ABARTH</a>
我做错了什么或者它对我不起作用。
这些 ID 是非标准的 CSS,因此您无法像搜索普通标签那样搜索它们,这类似于 <div id="this-is-normal">
。相反,您需要匹配 div 的 ID 中的模式。
我想这就是你需要的:
@page.css('div[id^="searchByConstraints:form:j_idt491"]')
所以对你来说是:
x.marka('div[id^="searchByConstraints:form:j_idt491"]')
作为旁注,我建议您将 class 命名为 Scrapper
或 Scrape
而且最好在 class 之后命名实例变量,所以
scrapper = Scrapper.new
scrapper.marka('blah') # etc. maybe you mean marker?
我已经想好如何解决了。我用 XPATH 比 CSS.
我更改此代码:
def marka(css)
@page.css(css).text
end
puts x.marka("a#searchByConstraints:form:j_idt491:0:j_idt493:0:j_idt495")
为此:
def marka(css)
@page.xpath(css).text
end
puts x.marka("//*[@id='searchByConstraints:form:j_idt491:0:j_idt493:0:j_idt495']")