2017-10-12 2 views
0

ですべての要素を取得するだから私はチェリオ、あなたはHTMLテキストとトラバースを解析することを可能にするノードサーバ側、上のjQueryに似たライブラリを使用していますjQueryの場合とまったく同じです。私はhtml本文のプレーンテキストを取得する必要がありますが、それだけではなく、対応する要素と番号を取得する必要があります。 IEは:プレーンテキストは第三段落要素で発見された場合、私のようなものだろう:DOMのトラバーサル - どのようにそれに対応するテキスト

{ 
    text: <element plaintext>, 
    element: "p-3" 
} 

を私は現在、これを行うにしようと、次の機能があります。

var plaintext_elements = traverse_tree($('body'));  

function traverse_tree(root, found_elements = {}, return_array = []) { 
    if (root.children().length) { 
     //root has children, call traverse_tree on that subtree 
     traverse_tree(root.children().first(), found_elements, return_array); 
    } 
    root.nextAll().each(function(i, elem) { 
     if ($(elem).children().length) { 
      //if the element has children call traverse_tree on the element's first child 
      traverse_tree($(elem).children().first(), found_elements, return_array) 
     } 
     else { 
      if (!found_elements[$(elem)[0].name]) { 
       found_elements[$(elem)[0].name] = 1; 
      } 
      else { 
       found_elements[$(elem)[0].name]++ 
      } 
      if ($(elem).text() && $(elem).text != '') { 
       return_array.push({ 
        text: $(elem).text(), 
        element: $(elem)[0].name + '-' + found_elements[$(elem)[0].name] 
       }) 
      } 
     } 
    }) 


    if (root[0].name == 'body') { 
     return return_array; 
    } 

} 

を私はに行くアム正しい方向に、私は他の何かをしようとしますか?これについての助けに感謝します。再びこれはjQueryではなくですが、サーバー側でCheerioです。

+0

を使用した場合トラバーサルの多くは、あなたが持っている要素を無視するために満足しているように見える必要はないと思う(彼らは、しかし、非常によく似ています)子どもとテキスト? 「

text

dt
」 – Matt

+0

「dt」のように、これは私が遭遇した問題の1つです。私は大文字の重複を取らずにその事件を処理する方法がわかりません。たとえば、 '​​blah blah blah'は、tdとaの両方について「あまりにも短い」を拾います。 – janedoe

答えて

0

は、私はあなたがあなたの現在のコードから* CSSセレクタ

function textElements($){ 
    const found = {} 
    return $('body *').map(function(el){ 
    if ($(this).children().length || $(this).text() === '') return 
    found[this.name] = found[this.name] ? 1 + found[this.name] : 1 
    return { 
     text: $(this).text(), 
     element: `${this.name}-${found[this.name]}`, 
    } 
    }).get() 
} 

textElements(cheerio.load(html) 
+0

が動作するように見えますが、htmlが「​​hello、ここをクリックしてを表示すると、 'という結果が表示されますが、そこから「ここをクリック」を選択すると問題が発生します。 – janedoe

関連する問題