Как мне извлечь значения из , которые находятся в , используя BeautifulSoup

#python #web-scraping #beautifulsoup #append

#python #очистка веб-страниц #beautifulsoup #добавить

Вопрос:

Предисловие: я из любопытства просматриваю веб-страницы на веб-сайте недвижимости. Будучи полным новичком в python, я модифицировал коды из других общих кодов, чтобы научиться. Я наткнулся на новую проблему, которую я никогда нигде не изучал, как это сделать. Итак, я хотел бы попросить сообщество о помощи.

Что я хочу: я хотел бы извлечь значения «4» и «3» из <li> элементов как отдельные элементы. Пожалуйста, посмотрите изображение, которое я прикрепил к этому сообщению, для извлечения элементов с веб-сайта.

Что я попытался: я вижу, что они перечислены в div class=»list-card-heading», поэтому я попробовал card.find("div", {"class":"list-card-heading"}).find("ul").find("li")) в приведенном ниже коде для атрибута с именем ‘bed_bath’. Но я получил только первое значение, встроенное в HTML…

 content = BeautifulSoup(response,"lxml")
        deck = content.find('ul',{'class':'photo-cards photo-cards_wow photo-cards_short'})
        for card in deck.contents:
            script = card.find('script',{'type': 'application/ld json'})
            if script:
                script_json = json.loads(script.contents[0])

                self.results.append({
                    'latitude': script_json['geo']['latitude'],
                    'longitude': script_json['geo']['longitude'],
                    'floorSize': script_json['floorSize']['value'],
                    'url': script_json['url'],
                    'price': card.find('div', {'class': 'list-card-price'}).text,
                    'bed_bath': (card.find("div", {"class":"list-card-heading"}).find("ul").find("li")),
                    'address': card.find('address', {'class':'list-card-addr'}).text
                })
  

Результат моей попытки новичка: <li>3<abbr class="list-card-label"> <!-- -->bds</abbr></li>

Пожалуйста, помогите

Изображение: Элементы с веб-сайта

Ответ №1:

Вы захотите использовать комбинацию find_all функции и text атрибута.

 elements = card.find("div", { "class": "list-card-heading" }).find("ul").find_all("li")) # get all <li> elements in the <el>

values = []
for element in elements:
    values.append(element.text) # get the inner text from the <li> element
  

или, более кратко:

 values = [element.text for element in card.find("div", { "class": "list-card-heading" }).find("ul").find_all("li"))]
  

Ответ №2:

Чтобы получить ["3", "4"] из фрагмента HTML, вы можете сделать:

 from bs4 import BeautifulSoup


txt = '''<ul class="list-card-details">
<li>
    "4"
    <abbr class="list-card-label">bds</abbr>
</li>
<li>
    "3"
    <abbr class="list-card-label">ba</abbr>
</li>
</ul>
'''

soup = BeautifulSoup(txt, 'html.parser')

out = [li.contents[0].strip() for li in soup.select('ul.list-card-details li')]
print(out)
  

С принтами:

 ['"4"', '"3"']
  

Или:

 out = [li.find(text=True).strip() for li in soup.select('ul.list-card-details li')]
  

Или:

 out = [li.get_text(strip=True, separator='|').split('|')[0] for li in soup.select('ul.list-card-details li')]