2017-12-22 35 views
0

同様のウェブページのデータをJSONに入れようとしています。ページの構造が定義されているが、各ブロックの量は変化し得る:Jquery/Cheerio:タグ間のコンテンツをループ経由でJSONにプッシュ

<h2>Block1</h2> 
 
\t <p><strong>Title1</strong></p> 
 
\t \t <p>content</p> 
 
\t \t 
 
\t \t <!–– the amount of p with content may vary ––> 
 
\t \t 
 
\t \t <p>content</p> 
 
\t \t <p>content</p> 
 
\t 
 
\t <!–– the amount of p with highlighted title may vary ––> 
 
\t 
 
\t <p><strong>Title_N</strong></p> 
 
\t \t <p>content</p> 
 
\t \t <p>content</p> 
 
\t 
 
<!–– the amount of h2 blocks may vary ––> 
 
    
 
<h2>Block_N</h2> 
 
\t <p><strong>Other_Title</strong></p> 
 
\t \t <p>content</p>

Iは、以下のようなJSONを形成しようとしているが、タグを反復処理する問題を抱えた - タグの間に - との間タグ彼らは階層の同じレベルにあり、その量は不明である:

result.push({ 
BlockName: $('.frame h2').text(), 
BlockContent:[{ 
    TitleName1: $('.frame p>strong:nth-of-class(1)').text(), 
     TitleContent1[{ 
      Content1:$('.frame p>strong:nth-of-class(1)').nextUntil($('.frame p>strong:nth-of-class(2)')).each(///), 
      Content2:$('.frame p>strong:nth-of-class(2)').nextUntil($('.frame p>strong:nth-of-class(3)')).each(///)), 
      /// 
      ContentN:$('.frame p>strong:nth-of-class(Last-1)').nextUntil($('.frame p>strong:nth-of-class(LastOne)')).each(///), 
        }], 
      ///  
      }], 
     }) 

正確にはどのようなタグ、私は、各エントリのためのデータを収集する必要があるまで、だから私も指定することはできません。それぞれの変数にすべてのタグのインデックスを格納しない方法はありますか?例えば

- 作成したフラットJSONでいくつかのエントリの階層を下げる:like this

私は何のアプローチを試してみてください?

ご協力ありがとうございました!

答えて

0

私はあなたがインスピレーションを得ることができる汚い例を書いた、出力変数はあなたの仕様に合っているはずです!

jsを使用してDOMのすべてのノードを繰り返し処理し、ノードのタイプ(HTMLParagraphElementなど)を使用するブロック、タイトル、またはコンテンツの名前であるかどうかを判断しました。

Array.prototype.slice.call(dom.children).forEach((node) => { 
    if (node instanceof HTMLHeadingElement) { 
    if (Object.keys(currentBlock).length !== 0) { 

JSFiddle:https://jsfiddle.net/z7dmwd7d/

+1

うわー!ありがとう、魅力のような作品!また、コードは近代的に見えます。私の方法のより窪んだインデントされたリストの代わりにこのアプローチを実装しようとします。 –

関連する問題