Я пытаюсь получить текст внутри class="hardfact", но также получаю текст class="hardfactlabel color_f_03", потому что этот класс находится внутри hardfact.
.text.strip() получает текст обоих классов, поскольку они вложены друг в друга.
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq
import requests
import lxml
my_url = 'https://www.immowelt.de/expose/2QC5D4A?npv=52'
page = requests.get(my_url)
ct = soup(page.text, 'lxml')
specs = ct.find('div', class_ = "hardfacts clear").findAll('div', class_ = "hardfact")
for items in specs:
e = items.text.strip()
print(e)
я получаю это
82.500 €
Kaufpreis
47 м²
Wohnfläche (ca.)
1
Zimmer
и я хочу этого
82.500 €
47 м²
1
Вот html-контент, который вы пытаетесь просканировать:
<div class = "hardfact ">
<strong>82.500 € </strong>
<div class = "hardfactlabel color_f_03">
Kaufpreis
</div>
</div>
<div class = "hardfact ">
47 m²
<div class = "hardfactlabel color_f_03">
Wohnfläche (ca.)
</div>
</div>
<div class = "hardfact rooms">
1
<div class = "hardfactlabel color_f_03">
Zimmer
</div>
</div>
Чего вы хотите добиться, так это удалить теги div внутри, чтобы вы могли просто разложить div:
for items in specs:
items.div.decompose()
e = items.text.strip()
print(e)
Если ваш первый класс «жесткий факт» не содержит тега «сильный», вы можете просто найти первый элемент следующим образом:
e = items.find().text.strip()
но мы не можем этого сделать, поэтому вам нужно разложить тег div.
Вы можете использовать зачищенные струны. Вы, вероятно, захотите добавить условие, чтобы обеспечить по крайней мере длину 3, прежде чем пытаться разрезать список.
import requests
from bs4 import BeautifulSoup as bs
r = requests.get('https://www.immowelt.de/expose/2QC5D4A?npv=52')
soup = bs(r.content, 'lxml')
items = soup.select('.hardfact')[:3]
for item in items:
strings = [string for string in item.stripped_strings]
print(strings[0])
Вероятно, какая-то операция декомпозиции этого нежелательного класса: stackoverflow.com/questions/39885359/beautifulsoup-разложить