2017-02-19 11 views
0

他の質問にはlookがありましたが、何も見つかりませんでした。BeautifulSoupで空のタグを数えることはできませんか?

私のHTMLは

<div class="rating-input"> 
    <i data-value="1" class="rating-active-star"></i> 
    <i data-value="2" class="rating-active-star"></i> 
    <i data-value="3" class="rating-active-star"></i> 
    <i data-value="4" class="rating-active-star"></i> 
    <i data-value="5" class="rating-inactive-star"></i> 
</div> 

そして、失敗のマイラインがこれですのようになります。

details = [{"name": film.select('h2')[0].text.split('\n')[0], 
      "rating":len(film.select('div i.rating-inactive-star'))} 
      for film in detail_row] 

それは持ち帰るように、この:すべての評価がゼロである

[{'name': 'The LEGO Batman Movie', 'rating': 0}, 
{'name': 'Sing', 'rating': 0}, 
{'name': 'John Wick: Chapter 2', 'rating': 0}, 
{'name': 'Fifty Shades Darker', 'rating': 0}, 
{'name': 'The Great Wall', 'rating': 0}, 
{'name': 'Hidden Figures', 'rating': 0}, 
{'name': 'La La Land', 'rating': 0}, 
{'name': 'The Founder', 'rating': 0}, 
{'name': 'Hacksaw Ridge', 'rating': 0}, 
{'name': 'T2 Trainspotting', 'rating': 0}, 
{'name': 'Split', 'rating': 0}, 
{'name': 'Patriots Day', 'rating': 0} 
] 

。私が期待しているのは、クラス rating-active-star(例えば、上記のhtmlの場合は4)の i要素の数です。

'div i.rating-active-star'から 'div i'に私の評価セレクターを変更すると、すべての 'rating': 0がここ

'rating': 5は私の全体のスクリプト(多かれ少なかれMVP)であるとなっ

import requests 
import bs4 
data = "si=1010841&sort=cin&max=0&bd=2017-02-23&css=cat-&mod=cinemapage_movie_list&attrs=2D%2C3D%2CIMAX%2CViP%2CVIP%2CDBOX%2C4DX%2CM4J%2CSS" 
data_list = data.split('&') 
info = {item[0]:item[1] for item in [elem.split('=') for elem in data_list]} 
response = requests.post('https://www.cineworld.co.uk/pgm-list-byfeat',info) 
soup = bs4.BeautifulSoup(response.text, "html.parser") 
detail_row = soup.select('div[id^=film_] div.row div.col-sm-10') 
details = [{"name": film.select('h2')[0].text.split('\n')[0], 
      "rating":len(film.select('div i.rating-active-star'))} 
      for film in detail_row] 

なぜリストの長さ空タグの長さは空タグの長さとは異なりますか?そして、どうすればこの問題を回避できますか?

+0

私は混乱しています。評価タグに値はありません。それで 'len(film.select( 'div i.rating-active-star'))))')は0です。そして 'len(film.select( 'div i')))')は5です。 ? – Batman

+0

@Batmanそのクラスのタグ数。私は空であると仮定していた!= null。それは間違っていますか? – Pureferret

+0

関連:http://tackoverflow.com/q/12336968/1075247 except私はテキストではなくクラスを取得したいです – Pureferret

答えて

1

問題は他の場所で発生することがあります。このスニペットは正常に動作するようです:

from bs4 import BeautifulSoup 

html = ''' 
<div class="rating-input"> 
<i data-value="1" class="rating-active-star"></i> 
<i data-value="2" class="rating-active-star"></i> 
<i data-value="3" class="rating-active-star"></i> 
<i data-value="4" class="rating-active-star"></i> 
<i data-value="5" class="rating-inactive-star"></i> 
</div> 
''' 

soup = BeautifulSoup(html, 'html.parser') 
print (len(soup.select('div i.rating-inactive-star')), 
     len(soup.select('div i.rating-active-star'))) 
+0

私のマシンでスクリプトが動作することを確認できます。 – Pureferret

関連する問題