【问题标题】:Cannot count empty tags with BeautifulSoup?不能用 BeautifulSoup 计算空标签?
【发布时间】:2017-03-11 09:06:56
【问题描述】:

我有一个look 来解答其他与此相关的问题,但我找不到任何东西。

我的 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}
]

所有评分都为零。我期待的是 i 类的 rating-active-star 元素的数量(例如,4,对于上面的 html)。

将我的评分选择器从'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]

为什么空标签列表的长度与非空标签的长度不同?我该如何解决这个问题?

【问题讨论】:

  • 我很困惑。评级标签中没有值。所以len(film.select('div i.rating-active-star'))) 是 0。len(film.select('div i'))) 是 5。你期待看到什么?
  • @Batman 该类的标签数量。我假设空!= null。有错吗?
  • 相关:stackoverflow.com/q/12336968/1075247 除了我想获得一个类而不是文本

标签: python css-selectors beautifulsoup


【解决方案1】:

问题可能出在其他地方。这个 sn-p 似乎按预期工作:

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')))

【讨论】:

    猜你喜欢
    • 2017-01-31
    • 2018-06-14
    • 1970-01-01
    • 2019-10-26
    • 2018-11-26
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2020-06-04
    相关资源
    最近更新 更多