2016-03-25 14 views
1

Hacker haberlerini (https://news.ycombinator.com/) x-ray/nodejs aracılığıyla nasıl kazıyorum?x-ray/node üzerinden kazı kazancı haberleri

[ 
    {title1, comment1}, 
    {title2, comment2}, 
    ... 
    {"‘Minimal’ cell raises stakes in race to harness synthetic life", 48} 
    ... 
    {title 30, comment 30} 
] 

bir haber tablosu vardır ama ... bunu kazımak bilen haberlerin her değilsin:

enter image description here

Ben bunun dışında böyle bir şey almak istiyorum web sitesi üç sütundan oluşmaktadır. Bunların kendilerine özgü bir ebeveynleri yoktur. Öyle ...

x("https://news.ycombinator.com/", "tr", [{ 
    title: [".deadmark+ a"], 
    comments: ".age+ a" 
}]) 

ve

x("https://news.ycombinator.com/", { 
    title: [".deadmark+ a"], 
    comments: [".age+ a"] 
}) 

2 yaklaşım 30 isim ve 29 comment-COUTS döndürür: Yani yapı Şimdiye kadar ben denedim bu

<tbody> 
    <tr class="spacer"> //Markup 1 
    <tr class="athing"> //Headline 1 ('.deadmark+ a' contains title) 
    <tr class>   //Meta Information 1 (.age+ a contains comments) 
    <tr class="spacer"> //Markup 2 
    <tr class="athing"> //Headline 2 ('.deadmark+ a' contains title) 
    <tr class>   //Meta Information 2 (.age+ a contains comments) 
    ... 
    <tr class="spacer"> //Markup 30 
    <tr class="athing"> //Headline 30 ('.deadmark+ a' contains title) 
    <tr class>   //Meta Information 30 (.age+ a contains comments) 

benziyor 30 başlıktan hangisinin bir yorumun eksik olduğu hakkında bir bilgi bulunmadığı için birlikte haritalandırma imkanı yoktur.

cevap

3

Herhangi bir yardım X-ray paketinde no way to reference the current context in a CSS selector olduğundan işaretleme yapmak kolay değildir. Bu, yorumlar almak için satırından sonraki tr kardeşini almak için yararlı olacaktır.

Bir sonraki satıra ulaşmak için "next sibling" notation (+) özelliğini kullanmaya devam edebiliriz, ancak isteğe bağlı yorumlar bağlantısını hedeflemek yerine, tüm satır metnini alıp normal değerlerle yorum değerini ayıklayacağız. Hiçbir yorum mevcut değilse, değeri 0 olarak ayarlayın.

Komple çalışma kodu:

var Xray = require('x-ray'); 
var x = Xray(); 

x("https://news.ycombinator.com/", { 
    title: ["tr.athing .deadmark+ a"], 
    comments: ["tr.athing + tr"] 
})(function (err, obj) { 
    // extracting comments and mapping into an array of objects 
    var result = obj.comments.map(function (elm, index) { 
     var match = elm.match(/(\d+) comments?/); 
     return { 
      title: obj.title[index], 
      comments: match ? match[1]: "0" 
     }; 
    }); 
    console.log(result); 
}); 

anda yazdırır:

[ { title: 'Follow the money: what Apple vs. the FBI is really about', 
    comments: '85' }, 
    { title: 'Unable to open links in Safari, Mail or Messages on iOS 9.3', 
    comments: '12' }, 
    { title: 'Gogs – Go Git Service', comments: '13' }, 
    { title: 'Ubuntu Tablet now available for pre-order', 
    comments: '56' }, 
    ... 
    { title: 'American Tech Giants Face Fight in Europe Over Encrypted Data', 
    comments: '7' }, 
    { title: 'Moving Beyond the OOP Obsession', comments: '34' } ] 
+0

da sayısı sayaç yorumlarınızı dönüştürmek ve hatayı işlemek için iyi olabilir –

İlgili konular