我正在尝试从此网址中抓取鞋子尺码: 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/