如何通过Nokogiri在页面上获取特定的可查看字符串。

问题描述 投票:0回答:1

目前,我可以用Nokogiri解析一个网站,并从页面中抓取特定的元素。然而,我需要能够抓取一个特定的字符串,比如 "缺货",这对用户来说是可见的。

page.text.match('Out of stock') 

这样抓取正确的字符串并返回true或false,如果该字符串在那里或不在那里,就可以正常工作,但是,有些链接,比如下面的,即使商品没有缺货,也会返回true,因为这个特定的字符串被隐藏在页面的脚本标签中。

https://www.walmart.com/ip/Funyuns-Onion-Flavored-Rings-6-oz/36915849?athcpid=36915849&athpgid=athenaItemPage&athcgid=null&athznid=PWSFM&athieid=v0&athstid=CS020&athguid=ba634528-888-172187cc96a580&athancid=null&athena=true

我正在寻找一种方法,只有当用户看到这个字符串时,才会将其提取出来,所以上面的链接应该返回false,因为它与 "缺货 "字符串相匹配,而下面的链接应该返回true(在发布时),因为商品实际上已经缺货了。

https://www.walmart.com/ip/4-Pack-Chesters-Flamin-Hot-Popcorn-4-25-oz/737202470?selected=true

我也知道我可以抓取包含该字符串的具体标签,但我需要监控数百个网站,所以解决方案必须是广泛搜索可见的字符串。

ruby ruby-on-rails-5 nokogiri
1个回答
1
投票

简答:我们可以使用 xpath 的语法。

长话短说:我强烈建议用css-classes来表达,因为在某些情况下,我们不仅可以在 "脚本标签 "中得到这个文本,还可以通过媒体查询或在项目预览区或其他地方得到这个文本,并将常见的情况作为大块来处理,但不要强行在所有情况下都使用一个特定的解决方案,以防出现意外的行为

所以,我们需要更具体地使用 "target-tags "来处理,比如。

Nokogiri::HTML.parse(page.html).xpath("//*[contains(@class, 'prod-PriceSection')]//*[contains(@class, 'prod-ProductOffer-oosMsg')]").text
"Out of stock"

所以,"监控数百个网站 "我们可以用这种方法。

xpath("//*[contains(@class, 'PriceSection')]").text

或者更好的是使用类似这样的方法来确保该元素是可见的。

page.all("//body//*[contains(text(), 'Out of stock')]", visible: true).count
# => 1

如果Capybara多使用一个请求(在之前的解决方案中)可能会成为一个问题,我们可以使用这个解决方案,它的速度更快。

xpath("//body//*[not(self::script) and contains(text(), 'Out of stock')]").count

我希望它能帮助你

© www.soinside.com 2019 - 2024. All rights reserved.