Как получить текст из в python?
Учусь парсить. Для первого опыта выбрал fl.ru. Пока получается все кроме одной вещи. Так вот :
Есть , он относится к классу 'b-post_price'. Мне надо получить текст данного тега.
Код который я для этого написал :
price = item.find_all('div', class_='b-post__price')
if price :
price = price.get_text()
else :
price = 'По договоренности'
HTML код :
<div class="b-post__price b-layout__txt_right b-post__price_padleft_10 b-post__price_padbot_5 b-
post__price_float_right b-post__price_fontsize_15 b-post__price_bold">
<a class="b-layout__txt_fontsize_12 b-layout__txt_padright_10 b-layout__txt_color_61a22b b-
layout__txt_text_decor_none b-layout__txt_bold" href="/promo/bezopasnaya-sdelka/" target="_blank"
title="Оплата через Безопасную сделку">
<span class="b-icon b-icon__shield b-icon_top_2_iphone"></span>
Безопасная сделка</a>
200 000 ₽
</div>
Проблема в том что он везде пишет 'По договренности'
Также если написать :
item.find('div', class_='b-post__price').get_text()
то ошибка тип у NoneType объекта нет get_text()
Ответы (2 шт):
Автор решения: Wairua
from bs4 import BeautifulSoup as Soup
from bs4.element import Tag
import re
if __name__ == '__main__':
html = """<div class="b-post__price b-layout__txt_right b-post__price_padleft_10 b-post__price_padbot_5 b-
post__price_float_right b-post__price_fontsize_15 b-post__price_bold">
<a class="b-layout__txt_fontsize_12 b-layout__txt_padright_10 b-layout__txt_color_61a22b b-
layout__txt_text_decor_none b-layout__txt_bold" href="/promo/bezopasnaya-sdelka/" target="_blank"
title="Оплата через Безопасную сделку">
<span class="b-icon b-icon__shield b-icon_top_2_iphone"></span>
Безопасная сделка</a>
200 000 ₽
</div>
"""
h = Soup(html, 'html.parser').find_all('div', {'class': 'b-post__price'})
div: Tag
for div in h:
if div.a:
div.a.replace_with('')
if div.span:
div.span.replace_with('')
try:
price = int(re.sub(r'\D', '', div.text.strip()))
except (TypeError, ValueError):
price = 'По договоренности'
# 200000
→ Ссылка
Автор решения: Дмитрий
Можете использовать:
item = soup.find('div', class_='b-post__price')
if item:
price = item.text.strip().split('\n')[1]
else:
price = 'По договоренности'
Вы ведь в переменную price хотели сумму положить, я правильно понял?
Что бы просто получить весь текст между тегами воспользуйтесь
item = soup.find('div', class_='b-post__price').text
→ Ссылка
Учусь парсить. Для первого опыта выбрал fl.ru. Пока получается все кроме одной вещи. Так вот : Есть , он относится к классу 'b-post_price'. Мне надо получить текст данного тега.
Код который я для этого написал :
price = item.find_all('div', class_='b-post__price')
if price :
price = price.get_text()
else :
price = 'По договоренности'
HTML код :
<div class="b-post__price b-layout__txt_right b-post__price_padleft_10 b-post__price_padbot_5 b-
post__price_float_right b-post__price_fontsize_15 b-post__price_bold">
<a class="b-layout__txt_fontsize_12 b-layout__txt_padright_10 b-layout__txt_color_61a22b b-
layout__txt_text_decor_none b-layout__txt_bold" href="/promo/bezopasnaya-sdelka/" target="_blank"
title="Оплата через Безопасную сделку">
<span class="b-icon b-icon__shield b-icon_top_2_iphone"></span>
Безопасная сделка</a>
200 000 ₽
</div>
Проблема в том что он везде пишет 'По договренности' Также если написать :
item.find('div', class_='b-post__price').get_text()
то ошибка тип у NoneType объекта нет get_text()
Ответы (2 шт):
Автор решения: Wairua
→ Ссылка
from bs4 import BeautifulSoup as Soup
from bs4.element import Tag
import re
if __name__ == '__main__':
html = """<div class="b-post__price b-layout__txt_right b-post__price_padleft_10 b-post__price_padbot_5 b-
post__price_float_right b-post__price_fontsize_15 b-post__price_bold">
<a class="b-layout__txt_fontsize_12 b-layout__txt_padright_10 b-layout__txt_color_61a22b b-
layout__txt_text_decor_none b-layout__txt_bold" href="/promo/bezopasnaya-sdelka/" target="_blank"
title="Оплата через Безопасную сделку">
<span class="b-icon b-icon__shield b-icon_top_2_iphone"></span>
Безопасная сделка</a>
200 000 ₽
</div>
"""
h = Soup(html, 'html.parser').find_all('div', {'class': 'b-post__price'})
div: Tag
for div in h:
if div.a:
div.a.replace_with('')
if div.span:
div.span.replace_with('')
try:
price = int(re.sub(r'\D', '', div.text.strip()))
except (TypeError, ValueError):
price = 'По договоренности'
# 200000
Автор решения: Дмитрий
→ Ссылка
Можете использовать:
item = soup.find('div', class_='b-post__price')
if item:
price = item.text.strip().split('\n')[1]
else:
price = 'По договоренности'
Вы ведь в переменную price хотели сумму положить, я правильно понял?
Что бы просто получить весь текст между тегами воспользуйтесь
item = soup.find('div', class_='b-post__price').text