【问题标题】:Using Beautiful Soup in a class that contains spaces在包含空格的类中使用 Beautiful Soup
【发布时间】:2018-02-27 22:43:37
【问题描述】:

我正在使用 Python 和 Beautiful Soup 从 Steam (http://store.steampowered.com/tags/en-us/RPG/) 中删除 20 款游戏的列表。但是这些游戏不是用div 分隔的,而是用a 标记。因此,我尝试执行以下操作:

all_games=soup.find_all('a',{'class':'tab_item   app_impression_tracked'})

(那些空格存在于 Steam 的 HTML 中)

但是,它返回了一个空列表,而不是所有包含名为 tab_item app_impression_tracked 的“类”的 a 标记

我不想只删除游戏的名称,还有它的价格、折扣……而且我对链接也不感兴趣。我只想获取a 标签,因为它包含我需要的有关游戏的所有信息。

有解决办法吗?

解决方案:

all_games = soup.find('div', {'id':'NewReleasesRows'}).find_all('a', {'class':'tab_item'})

那些空格是有问题的,班级的真实名称是tab_item,而不是我想的tab_item app_impression_tracked

【问题讨论】:

标签: python web-scraping beautifulsoup


【解决方案1】:

您也可以在 soup.select() 方法中使用 css-rules 找到所需的项目。 下一个代码从页面中选择 20 个项目:

all_games = soup.select("a.tab_item[class*='app_impression_tracked']")

当标签属性class 中的类被空格分隔时,您可以这样匹配它们:"a.tab_item.app_impression_tracked"。但是这条规则与a 完全匹配这两个类,而里面没有其他类。看起来列表中的 20 项几乎没有不同的 classes。 括号中的*= 表示contains next string

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并设法通过这样做来解决它

    className = 'tab_item   app_impression_tracked'
    all_games = soup.find_all('a', {'class': className.split() if '  ' in className else className})
    

    所以,如果类名有两个以上的空格,我们会拆分(按空格,所以className 变成['tab_item', 'app_impression_tracked'])className 来获取元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 2015-11-08
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2019-02-20
      • 2021-03-20
      • 2017-05-31
      相关资源
      最近更新 更多