Python 和 Beautifulsoup 4 - 无法过滤类?

标签 python web-scraping beautifulsoup

我正在尝试从此网址中抓取鞋子尺码: http://www.jimmyjazz.com/mens/footwear/jordan-retro-13--atmosphere-grey-/414571-016?color=Grey

我想做的是只获取可用的尺寸,例如仅那些未变灰的。

尺寸全部包含在 a 元素中。可用尺寸为 box 类,不可用尺寸为 box piunavailable 类。

我尝试过使用 lambda 函数、ifs 和 CSS 选择器 - 似乎都不起作用。我猜这是因为我的代码的结构方式。

其结构如下:

if 尝试

size = soup2.find('div', attrs={'class': 'psizeoptioncontainer'})
getsize = str([e.get_text() for e in size.findAll('a', attrs={'class': 'box'}) if 'piunavailable' not in e.attrs['class']])

lambda 尝试

size = soup2.find('div', attrs={'class': 'psizeoptioncontainer'})
getsize = str([e.get_text() for e in size.findAll(lambda tag: tag.name == 'a' and tag.get('class') == ['box piunavailable'])])

CSS 选择器尝试

size = soup2.find('div', attrs={'class': 'psizeoptioncontainer'})
getsize = str([e.get_text() for e in size.findAll('a[class="box"]'))

因此,对于提供的 URL,我期望结果是一个字符串(从列表转换而来),它是所有可用的大小 - 在编写这个问题时,它应该是 - '8', ' 8.5'、'9'、'9.5'、'10'、'10.5'、'11'、'11.5'、'13'

相反,我得到了所有尺寸,'7.5', '8', '8.5', '9', '9.5', '10', '10.5', '11', '11.5' ,'12','13'

有人知道如何让它发挥作用(或者知道解决我的问题的优雅解决方案)吗?预先感谢您!

最佳答案

你想要一个CSS :not伪类选择器以排除其他类。使用 bs4 4.7.1。

sizes = [item.text for item in soup.select('.box:not(.piunavailable)')]

全文:

import requests
from bs4 import BeautifulSoup

r = requests.get('http://www.jimmyjazz.com/mens/footwear/jordan-retro-13--atmosphere-grey-/414571-016?color=Grey')  
soup = BeautifulSoup(r.content,'lxml')  
sizes = [item.text for item in soup.select('.box:not(.piunavailable)')]
print(sizes)

关于Python 和 Beautifulsoup 4 - 无法过滤类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55364688/

相关文章:

python - 如何从文档图像中检测多个文本 block ?

Python 请求 api 不在表体中获取数据

javascript - 在网页抓取上使用 Selenium 加载更多内容

python - 如何使 Python 中的字符串解析不那么笨拙?

python - "DataFrame"对象没有属性 'reshape'

python - 不一致的刻度标签字体与 matplotlib 子图

python - git ls-files 脚本如何工作

python - urllib.open() 无法处理带有 # 的字符串?

Python BeautifulSoup 提取特定的 URL

javascript - Python Selenium WebDriver JavaScript 表迭代