在BS4中使用findAll创建列表

时间:2017-07-31 08:25:44

标签: python beautifulsoup bs4

我首先会说我是Python的新手。我最近一直在研究一个Slack机器人,而且到目前为止我还在这里。

source = requests.get(url).content
soup = BeautifulSoup(source, 'html.parser')
price = soup.findAll("a", {"class":"pricing"})["quantity"]

这是我试图抓取的HTML代码。

<a class="pricing" saleprice="240.00" quantity="1" added="2017-01-01"> S </a>
<a class="pricing" saleprice="21.00" quantity="5" added="2017-03-14"> M </a>
<a class="pricing" saleprice="139.00" quantity="19" added="2017-06-21"> L </a>

当我只使用soup.find()时,我能够找到第一个数量值,但我需要列表中的所有数值。我考虑使用不同的库,如lxml而不是bs4,但也没有任何运气。任何帮助都非常感谢,因为我已经花了很长时间在这上面。

1 个答案:

答案 0 :(得分:3)

findAll方法返回bs4 Tag元素的列表,因此您无法直接选择属性。但是,您可以使用简单的列表推导从该iterable中的项目中选择属性。

price = [a.get("quantity") for a in soup.findAll("a", {"class":"pricing"})] 

请注意,访问属性时最好使用get,因为如果None字典中不存在该键,则会返回attrs(或者您可以设置默认值)。 / p>

正如Jon Clements所指出的,如果您不希望列表中包含None项,则可以按“类”和“数量”进行过滤,以防某些项目没有“数量”属性。

price = [a["quantity"] for a in soup.find_all("a", {"class":"pricing", "quantity":True})]