亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么只有我的第二個 if 語句給出結果并覆蓋我的第一個 if 語句?

為什么只有我的第二個 if 語句給出結果并覆蓋我的第一個 if 語句?

智慧大石 2022-12-22 15:04:24
我正在為 IMDB 構建一個爬蟲并遇到了一個問題。它不是技術性的,但是,似乎更概念化。我在下面附上了我的代碼。所以我想弄清楚的是為什么只有第二個 if 語句運行?每當我運行該程序時,我的數組 (Metascore) 都會填充來自第二個 if 語句的值。注意:兩個 if 語句都運行,但只有第二個的值填充數組。我認為這可能與 .find() 有關,但我想不出一個解釋。我還附上了一張圖片,顯示了我試圖抓取的 HTML 的結構。網站鏈接是:https ://www.imdb.com/search/title/?groups=top_1000&ref_=adv_prv 。最后一張圖片顯示了代碼結果。如果有人有解決方案或想法,請將其放在下面。謝謝。  $('.ratings-bar').each((i, el) => {    if($(el).find('.ratings-metascore .favorable')){      metascore[i] = $(el).find('.ratings-metascore .favorable').text().trim();    }    if($(el).find('.ratings-metascore .mixed')){      metascore[i] = $(el).find('.ratings-metascore .mixed').text().trim();    }  })  console.log(metascore);
查看完整描述

4 回答

?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

問題是$(el).find('.ratings-metascore .favorable').text()即使沒有找到元素,實際上返回 '' 一個空字符串,所以每次都用空字符串$(el).find('.ratings-metascore > .mixed').text()覆蓋的結果。metascore[i]$(el).find('.ratings-metascore .favorable').text()


只是注釋掉


if($(el).find('.ratings-metascore .mixed')){

   metascore[i] = $(el).find('.ratings-metascore .mixed').text().trim();

}

你會看到你的.favorable結果


更新


由于這兩個條件都返回 true,因為find()返回總是一個對象,你必須添加.length > 0到你的 if 條件以使其正常工作


 $('.ratings-bar').each((i, el) => {


    if($(el).find('.ratings-metascore .favorable').length > 0){

      metascore[i] = $(el).find('.ratings-metascore .favorable').text().trim();

    }


    if($(el).find('.ratings-metascore .mixed').length > 0){

      metascore[i] = $(el).find('.ratings-metascore .mixed').text().trim();

    }

  })

詳細解釋


假設你有這個 HTML


<div class="a">

  <span class="b">hello</span>

  <span class="b">world</span>

</div>

然后你運行這個javascript


$(document).find('.a .b');

/**

* this code will return an Object like the following

* {

*   "0": span.b(DOM element)

*   "1": span.b(DOM element)

*   length: 2

* }

*/


$(document).find('.a .b').text();

/**

* this code will return a string like the following

* helloworld

*/

如果你運行這個你試圖找到.a .c不存在的元素


$(document).find('.a .c');


/**

* this code will return an Object like the following

* {

*   length: 0

* }

*/


$(document).find('.a .c').text();

/**

* this code will return an empty string, since no element was found

*/

因此,在這兩種情況下,結果find()始終是一個 Object,它在語句中始終為TRUEIF,并且由于text()始終返回一個字符串(未找到任何元素時為空字符串),這就是為什么您的第二個條件總是覆蓋第一個條件,因為它總是真實的。


查看完整回答
反對 回復 2022-12-22
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

從屏幕截圖中我可以看出您要查找的元素實際上并不同時具有類ratings-metascore和mixed. 您正在做的是嘗試通過父元素屬性和子元素屬性訪問元素,應該這樣做:


$('.ratings-bar').each((i, el) => {


  if($(el).find('.ratings-metascore > .favorable')){

    metascore[i] = $(el).find('.ratings-metascore > .favorable').text().trim();

  }


  if($(el).find('.ratings-metascore > .mixed')){

    metascore[i] = $(el).find('.ratings-metascore > .mixed').text().trim();

  }

})


console.log(metascore);


查看完整回答
反對 回復 2022-12-22
?
DIEA

TA貢獻1820條經驗 獲得超2個贊

您必須通過第二個 if 語句創建一個 else if,然后它必須起作用。PS:抱歉我的英語不好。



查看完整回答
反對 回復 2022-12-22
?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

一個更簡單的方法是:


metascore[i] = $(el).find('.ratings-metascore .favorable').text().trim() || 

  $(el).find('.ratings-metascore .mixed').text().trim()

請注意,如果元素不存在,這些都將評估為空字符串,這在 javascript 中是錯誤的:


let foo = "" || "bar"

// foo is now "bar"


查看完整回答
反對 回復 2022-12-22
  • 4 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號