Как на bs4 спарить тег html без класса?

Рейтинг: 1Ответов: 4Опубликовано: 17.02.2023
<div class="object-info__parametrr">
   <span>Общая площадь</span>
   <span>
       70.5 м
       <sup>2</sup>
   </span>
</div>

Такой блок кода и мне нужно вытащить значение 70.5 , но span без класса, как спарсить без класса?

Ответы

▲ 0Принят

как спарсить без класса?

from bs4 import BeautifulSoup

with open('test.html', 'r') as file:
    text = file.read()
    soup = BeautifulSoup(text, 'lxml')
    
    div_tag = soup.find('div', class_ = 'object-info__parametrr')
    span_tag = div_tag.find_all('span')[1]
    print(span_tag.text)

В файле test.html код из вашего вопроса. Результат работы программы:

 70.5 м
 2

Как разбить строку по пробелам и взять первый элемент - знаете ?

▲ 1
from bs4 import BeautifulSoup

txt = '''<div class="object-info__parametrr">
   <span>Общая площадь</span>
     <span>
     70.5 м
     <sup>2</sup>
     </span>
</div>'''

soup = BeautifulSoup(txt, 'lxml')
div_tag = soup.find('div', class_ = 'object-info__parametrr')
_, span_tag, _ = div_tag.stripped_strings
print(span_tag[:-2])
# 70.5
▲ 0

У css-селекторов можно задавать индексы элементов через псевдокласс :nth-child:

.object-info__parametrr > span:nth-child(2)

Это будет работать даже в инспекторе браузера

Пример:

from bs4 import BeautifulSoup


html = """
<div class="object-info__parametrr">
   <span>Общая площадь</span>
   <span>
       70.5 м
       <sup>2</sup>
   </span>
</div>
"""
root = BeautifulSoup(html, 'html.parser')
span = root.select_one('.object-info__parametrr > span:nth-child(2)')
print(span.get_text(strip=True))
# 70.5 м2

PS.

Если нужно удалить <sup>2</sup>, чтобы после почистить значение от не цифр и точек, то используем decompose и небольшую обработку (можно заменить на регулярку, но это к другому вопросу :) ):

span.sup.decompose()
print(''.join(c for c in span.get_text(strip=True) if c.isdigit() or c == '.'))
# 70.5
▲ 0
from bs4 import BeautifulSoup

html = '''
<div class="object-info__parametrr">
   <span>Общая площадь</span>
   <span>
       70.5 м
       <sup>2</sup>
   </span>
</div>
'''

soup = BeautifulSoup(html, 'html.parser')
span = soup.find('div', {'class': 'object-info__parametrr'}).find_all('span')[1]
print(span.text) 
# 70.5 м
#      2