Использование findAll в 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 ответ
findAll
метод возвращает список bs4 Tag
элементы, поэтому вы не можете выбрать атрибуты напрямую. Однако вы можете выбрать атрибуты из элементов в этой итерации с простым пониманием списка.
price = [a.get("quantity") for a in soup.findAll("a", {"class":"pricing"})]
Обратите внимание, что лучше всего использовать get
при доступе к атрибутам, потому что он возвращает None
(или вы можете установить значение по умолчанию), если ключ не существует в attrs
толковый словарь.
Как отметил Джон Клементс, вы можете фильтровать по "классу" и "количеству", если вы не хотите, чтобы ваш список имел None
элементы, в случае, если некоторые элементы не имеют атрибута "количество".
price = [a["quantity"] for a in soup.find_all("a", {"class":"pricing", "quantity":True})]