最近我发现node-osmosis
是一个相对较新的模块,但具有强大的功能,例如接受CSS和XPath选择器,快速抓取和良好的语法。
所以我通过使用CSS和XPath运行一些擦除来比较节点渗透和X射线。我遇到了两个问题如下。
问题1:节点渗透的未知结果
node-osmosis
在其主页上提供了一个简单示例,内容为
var osmosis = require('osmosis');
osmosis
.get('www.craigslist.org/about/sites')
.find('h1 + div a')
.set('location')
.follow('@href')
.find('header + div + div li > a')
.set('category')
.follow('@href')
.paginate('.totallink + a.button.next:first')
.find('p > a')
.follow('@href')
.set({
'title': 'section > h2',
'description': '#postingbody',
'subcategory': 'div.breadbox > span[4]',
'date': 'time@datetime',
'latitude': '#map@data-latitude',
'longitude': '#map@data-longitude',
'images': ['img@src']
})
.data(function(listing) {
// do something with listing data
})
.log(console.log)
.error(console.log)
.debug(console.log)
如果我只想获取location
信息,请转到
osmosis
.get('www.craigslist.org/about/sites')
.find('h1 + div a')
.set('location')
.log(console.log)
.error(console.log)
.debug(console.log)
然而,我得到的是
(get) starting
(get) loaded [get] www.craigslist.org/about/sites
(find) found 714 results for "h1 + div a"undefined
事实证明渗透发现了714个条目h1+div a
,但我无法弄清楚undefined
这里是什么。
问题2:结果不一致节点 - 渗透,X射线和Chrome控制台
我想检索RobotShop的产品信息。我决定使用XPath选择器
osmosis
.get('http://www.robotshop.com/en/robots-to-build.html')
.find('//div[@class="wrap-thumbnailCatTop"]')
.set('products')
.log(console.log)
.debug(console.log)
但这就是我得到的。我一无所获。
(get) starting
(get) loaded [get] http://www.robotshop.com/en/robots-to-build.html
(get) (process) stack: 3, RAM: 30.49Mb (+30.49Mb) requests: 1, heap: 9.20Mb / 16.24Mb
(get) (process) stack: 0, RAM: 30.49Mb (+0.00Mb) requests: 1, heap: 9.22Mb / 16.24Mb
我认为我的XPath是有效的,因为我在Chrome的控制台中测试了它
$x('//div[@class="wrap-thumbnailCatTop"]')
并获得了我想要的产品说明。我还尝试在控制台中使用CSS选择器$('.wrap-thumbnailCatTop')
但无法检索任何内容。最后,我使用x-ray尝试了这个CSS选择器.wrap-thumbnailCatTop
,这是基于cheerio,并得到了很好的结果!代码是:
x('http://www.robotshop.com/en/robots-to-build.html', '.wrap-thumbnailCatTop', [{
image: 'a img@src',
product: '.product-name a@title',
code: 'product-code',
ratings: '.rating .amount a',
price: '.price-box .regular-price .price'
}])
.write('results.json')
而results.json
是
[
{
"image": "http://www.robotshop.com/media/catalog/product/cache/1/small_image/135x/9df78eab33525d08d6e5fb8d27136e95/a/r/arduino-uno-usb-microcontroller-rev-3_2.jpg",
"product": "Arduino Uno USB Microcontroller Rev 3",
"price": "USD $21.89"
},
{
"image": "http://www.robotshop.com/media/catalog/product/cache/1/small_image/135x/9df78eab33525d08d6e5fb8d27136e95/h/i/hitec-hs422-servo-motor-13.jpg",
"product": "HS-422 Servo Motor"
},
因此,毕竟我感觉在解析选择器时可能存在不同的标准或不同的实现。有人能告诉我正确的方法吗?
答案 0 :(得分:1)
您没有看到任何内容,因为Osmosis默认情况下不会记录它正在收集的数据。它获取了页面并匹配了您想要的元素,但您没有告诉它如何处理数据。以下代码将在处理数据时打印出来。
osmosis
.get('www.craigslist.org/about/sites')
.find('h1 + div a')
.set('location')
.data(function(data) {
console.log(data);
});
您还可以在数组中累积数据,然后在最后使用.done()