Как на bs4 спарить тег html без класса?
<div class="object-info__parametrr">
<span>Общая площадь</span>
<span>
70.5 м
<sup>2</sup>
</span>
</div>
Такой блок кода и мне нужно вытащить значение 70.5 , но span без класса, как спарсить без класса?
Ответы (4 шт):
Автор решения: Sergey
→ Ссылка
как спарсить без класса?
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
Как разбить строку по пробелам и взять первый элемент - знаете ?
Автор решения: Сергей Ш
→ Ссылка
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
Автор решения: gil9red
→ Ссылка
У 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
Автор решения: Leonid
→ Ссылка
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