目前,我可以用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
我也知道我可以抓取包含该字符串的具体标签,但我需要监控数百个网站,所以解决方案必须是广泛搜索可见的字符串。
简答:我们可以使用 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
我希望它能帮助你