Beatiful Soup проблема с получение значения атрибута

Не удается спарсить значение атрибута id тега article В чем моя ошибка?:

<article class="post-11632 post type-post status-publish format-standard has-post-thumbnail" id="post-11632">           
    <!--Здесь много вложенных блоков <div> <a> <span>, но тег <article> более не встречается-->
</article>

Парсер: Ошибка возникает при получении post_id далее все работает

import requests
import config


from bs4 import BeautifulSoup

#https://freesteam.ru/

def get_html(url):
    r = requests.get(url)
    return r.text


def get_free_game(html):
    soup = BeautifulSoup(html, 'lxml')

    card = soup.find('div', class_='row content-grid').find_all('div', class_='post-box')

    for post_data in card:
        #post_id, entry-title, entry-content
        try:
            post_id = post_data.find(class_='post type-post').get('id')
        except:
            post_id = '' 

        try:
            title = post_data.find('h2', class_='entry-title').find('a').text.strip()
        except:
            title = ''

        try:
            content = post_data.find('div', class_='entry-content').find('p').text.strip()
        except:
            content = ''

Консоль выдает:

>>> post_id = post_data.find('article', class_='post type-post').get('id')

Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'get'

Предпринимал такие попытки

>>> post_id = post_data.find('article', class_='post type-post')
>>> post_id_soup = BeautifulSoup('post_id.text')
>>> post_id_soup.article['id']

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable'

Ответы (1 шт):

Автор решения: devnull

Как вариант можно воспользоваться регуляркой:

import re

from bs4 import BeautifulSoup

html = """<article class="post-11632 post type-post status-publish format-standard has-post-thumbnail" id="post-11632">           
    <!--Здесь много вложенных блоков <div> <a> <span>, но тег <article> более не встречается-->
</article>"""


soup = BeautifulSoup(html, 'lxml')

post_id = soup.find('article', class_=re.compile(r"^(post|type-post)$"))

data = post_id.get('id')

По регулярке, на вход к ней идет class, то есть не весь список, а конкретное название, по этой причине есть начало ^ и конфе $ строки


Также это можно реализовать по другому :

# ... оставил только код поиска: 
post_id = soup.find('article', class_=lambda class_name: class_name in ('post', 'type-post'))

Офф дока по этому моменту:

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-by-css-class

→ Ссылка