Webscraping - получить первое и второе значение из тега div с несколькими значениями, разделенными запятой

У меня есть тег, который выглядит так

<div class="small text-gray mb-2">
    <div>
        Pierre M
        <!-- -->
        , 
        <!-- -->
        08/18/2018
        <!-- --> 
        <div class="d-inline-block px-0_25 text-white bg-primary-darker rounded">
            updated 
            <!-- -->
            03/11/2021
        </div>
      </div>
       <div>Long Range 4dr Sedan (electric DD)</div>
</div>

Я хотел бы получить только имя и фамилию, поэтому "Пьер М" и дату "18.08.2018"

я пробовал этот код

import bs4
soup = BeautifulSoup()
data = []

for e in content_list:
    data.append({
        'reviewer-name':e.select_one('div').text,
        'reviewe-date':e.select_one('div').text,
    })

Но это приводит к тому, что каждое значение этого тега берется, поэтому я получаю

'reviewe-date': 'John Schreiber, 10/06/2018 updated 10/08/2019Long Range 4dr Sedan (electric DD)',
'reviewer-name': 'John Schreiber, 10/06/2018 updated 10/08/2019Long Range 4dr Sedan (electric DD)'
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
0
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать find_all(text=True, recursive=False), чтобы получить только первый раздел текста в вашем конкретном случае:

for e in soup.select('div.small'):
    data.append({
        'reviewer-name':''.join(e.div.find_all(text=True, recursive=False)).split(',')[0].strip(),
        'reviewe-date':''.join(e.div.find_all(text=True, recursive=False)).split(',')[-1].strip(),
    })

Альтернативой было бы проверить дочерний элемент <div> с обновленным, сохранить его текст, если необходимо, и decompose() его из DOM - использование walrus operator требует python 3.8 или более поздней версии, иначе используйте стандарт if statement):

for e in soup.select('div.small'):
    if (u := e.select_one('div.rounded')):
        updated = u.text.split('updated')[-1].strip()
        u.decompose()
    else: 
        updated = None
    data.append({
        'reviewer-name':e.div.text.split(',')[0].strip(),
        'reviewe-date':e.div.text.split(',')[-1].strip(),
        'reviewe-updated':updated
    })
Пример
from bs4 import BeautifulSoup
html = '''
<div class="small text-gray mb-2">
    <div>
        Pierre M
        <!-- -->
        , 
        <!-- -->
        08/18/2018
        <!-- --> 
        <div class="d-inline-block px-0_25 text-white bg-primary-darker rounded">
            updated 
            <!-- -->
            03/11/2021
        </div>
      </div>
       <div>Long Range 4dr Sedan (electric DD)</div>
</div>
'''


soup = BeautifulSoup(html)
data = []

for e in soup.select('div.small'):
    if (u := e.select_one('div.rounded')):
        updated = u.text.split('updated')[-1].strip()
        u.decompose()
    else: 
        updated = None
    data.append({
        'reviewer-name':e.div.text.split(',')[0].strip(),
        'reviewe-date':e.div.text.split(',')[-1].strip(),
        'reviewe-updated':updated
    })

data
Выход
[{'reviewer-name': 'Pierre M', 'reviewe-date': '08/18/2018', 'reviewe-updated': '03/11/2021'}]

теперь он говорит, что u не определен, не могли бы вы мне помочь?

Axton 09.04.2022 13:28

Плюс за обзор_дата получаю: 29.06.2018 обновлено 02.07.2019Long Range 4dr Sedan (электрический DD) вместо просто первой даты

Axton 09.04.2022 13:33

Оператор walrus — это функция Python 3.8 или более поздней версии, но вы также можете использовать стандартный оператор if if e.select_one('div.rounded'): updated = e.select_one('div.rounded').text.split('updated')[-1].strip(‌​) e.select_one('div.rounded').decompose()

HedgeHog 09.04.2022 13:52

Я сделал это решение с вашим примером html в своем локальном с регулярным выражением:

from bs4 import BeautifulSoup
import re
with open("C:/Users/yas/Desktop/salah.txt", "r") as My_file:
    soup = BeautifulSoup(My_file, 'html.parser')
    e = soup.select_one('div').text.strip()
    exp = re.split("\n",e)
    buyer_name=exp[0]
    buyer_date = exp[4]
    print(buyer_name,buyer_date)

вы можете использовать любую форму регулярного выражения и его методы в своем коде с любыми циклами для вашей базы данных :)

Другие вопросы по теме