Надеюсь, не всегда, идентификатор должен быть уникальным, значение find_all
, вероятно, не требуется.
С bs4 4.7.1+ вы можете использовать: не исключать дочерний диапазон с идентификатором
from bs4 import BeautifulSoup as bs
html = '''<h1 id="productTitle">
<a href="https://www.example.com/product/">
<span id="productBrand">BRAND</span>
</a>
<span>PRODUCT TITLE </span>
</h1>
'''
soup = bs(html, 'lxml')
print(soup.select_one('#productTitle span:not([id])').text)
Вы также можете nth-child
print(soup.select_one('#productTitle span:nth-child(2)').text)
или
print(soup.select_one('#productTitle span:nth-child(even)').text)
или даже непосредственный братский комбинатор, чтобы получить span
после ребенка a
print(soup.select_one('#productTitle a + span').text)
или прикованный next_sibling
print(soup.select_one('#productTitle a').next_sibling.next_sibling.text)