Существует несколько таких тегов <div>
, где class = "b-card"
в файле HTML, который я извлек, содержит следующий HTML-код:
<div class = "b-card">
<div class = "builder-exp-wrap">
<a class = "no-ajaxy img-wrap js-rc-link" data-href = "/puravankara-limited-100046">
<img alt = "Images for Logo of Puravankara" src = "https://im.proptiger.com/3/100046/13/puravankara-4491843.jpeg?width=155&height=50"/>
</a>
<div class = "builder-details-wrap">
<a class = "no-ajaxy builder-name put-ellipsis js-b-card" data-builderid = "100046" href = "/puravankara-limited-100046" target = "_blank">
Puravankara Limited
</a>
</div>
</div>
<div class = "b-dtls">
<div class = "count-wrap one">
<div class = "circle">
<div class = "val">
99
</div>
</div>
<div class = "lbl">
Total Projects
</div>
</div>
<div class = "count-wrap">
<div class = "circle">
<div class = "val">
36
</div>
</div>
<div class = "lbl">
Ongoing Projects
</div>
</div>
</div>
Под ним я хочу очистить текст тегов div, где class = "val"
. Как показано ниже, я могу итеративно очистить весь блок тега div, где class = "b-card"
, используя метод find_all()
. И внутри него я также могу очистить текст под тегом div, где class = "builder-details-wrap"
из-за того, что в дочернем элементе был один тег a
. Но если я хочу очистить данные под тегом div, где class = "count-wrap"
, я не знаю, как действовать. Под этим родительским тегом есть два дочерних тега div, и я не знаю, как выбрать тот, из которого class = "circle"
мне в конечном итоге нужно будет перейти к тегу div класса, где class = "val"
очистить его текст.
from bs4 import BeautifulSoup
import requests
main_url = "https://www.proptiger.com/bangalore/all-builders?page=1"
main_url_html=BeautifulSoup(requests.get(main_url).text,"html.parser")
for bcard in main_url_html.find_all('div',class_='b-card'):
bcard_CompanyName=bcard.find('div',class_='builder-details-wrap')
bcard_CompanyName=bcard_CompanyName.a.text
bcard_OngoingProjs=bcard.find('div',class_='count-wrap')
bcard_OngoingProjs=bcard_OngoingProjs.div.div.text
Любая помощь будет принята с благодарностью.
я предпочитаю использовать select
вместо find
, но это, конечно, мой личный выбор
с этим кодом
for bcard in main_url_html.select('div.b-card'):
bcard_CompanyName=bcard.select_one('div.builder-details-wrap a').text
print(bcard_CompanyName)
for project_stat in bcard.select('div.count-wrap'):
lbl = project_stat.select_one('.lbl').text.strip()
val = project_stat.select_one('.val').text.strip()
print(lbl, val)
ты получаешь за первую компанию
Mahindra Lifespaces Developers
Total Projects 145
Ongoing Projects 70
Вы можете использовать селектор CSS.
Внутри вашего цикла:
bcard_OngoingProjs = bcard.select_one('div.count-wrap:nth-of-type(2) div.circle div.val')
bcard_OngoingProjs = bcard_OngoingProjs.text.strip()
Полный код с изменениями:
from bs4 import BeautifulSoup
import requests
main_url = "https://www.proptiger.com/bangalore/all-builders?page=1"
main_url_html = BeautifulSoup(requests.get(main_url).text, "html.parser")
for bcard in main_url_html.find_all('div', class_='b-card'):
bcard_CompanyName = bcard.find('div', class_='builder-details-wrap')
bcard_CompanyName = bcard_CompanyName.a.text.strip()
bcard_OngoingProjs = bcard.select_one('div.count-wrap:nth-of-type(2) div.circle div.val')
bcard_OngoingProjs = bcard_OngoingProjs.text.strip()
#do something with bcard_OngoingProjs and bcard_CompanyName variables ...