Парсинг html-страницы python. BeautifulSoup

Всем привет! Передо мной встала задача по парсингу данных с данной веб-страницы. На ней представлены данные по работам, выставленным на аукцион. Необходимо получить подчеркнутые красным маркером данные для каждого лота на странице. скриншот Пытался сделать это с помощью BeautifulSoup и поиску по строкам с помощью регулярных выражений. У меня получилось собрать данные по номеру лота, наименованию картины, странам, названию аукциона и его дате (крайний правый и крайний левый блоки). Сбор данных из центральных блоков вызывает затруднения - не нашел способа сослаться на заключенные в тегах строки. Привожу пример текущего скрипта:

import requests
import re
from bs4 import BeautifulSoup as bs
import pandas as pd

URL_TEMPLATE = "https://www.artprice.com/artist/15079/wassily-kandinsky/lots/pasts?ipp=100"
FILE_NAME = "test"

def parse(url = URL_TEMPLATE):
    result_list = {'lot': [], 'name': [], 'date': [], 'type1': [], 'type2': [], 'width': [], 'height': [], 'estimate': [], 'hummerprice': [], 'auction_date': [], 'auction': [], 'country': []}
    r = requests.get(URL_TEMPLATE)
    soup = bs(r.text, "html.parser")
    lot_info = soup.find_all('p', class_='hidden-xs')
    date_info = soup.find_all('date')
    names_info = soup.find_all('a', class_='sln_lot_show')
    auction_info = soup.find_all('p', class_='visible-xs')
    auction_date_info = soup.find_all(string=re.compile('\d\d\s\w\w\w\s\d\d\d\d'))[1::2]
    for i in range(len(lot_info)):
        result_list['lot'].append(lot_info[i].text)
    for i in range(len(date_info)):
        result_list['date'].append(date_info[i].text)
    for i in range (len(names_info)):
        result_list['name'].append(names_info[i].text)
    for i in range(0, len(auction_info), 2):
        result_list['auction'].append(soup.find_all('p', class_='visible-xs')[i].strong.string)
    for i in range(1, len(auction_info), 2):
        result_list['country'].append(soup.find_all('p', class_='visible-xs')[i].string)
    for i in range(len(auction_date_info)):
        result_list['auction_date'].append(auction_date_info[i])
    return result_list
df = pd.DataFrame(data=parse())
df.to_excel("test.xlsx")

Незаполненными остались массивы type1 (что должно соответствовать "Print-Multiple" со скрина), type2 (="Print in colors"), width (75), height (80) и hummerprice (="not communicated).


Ответы (1 шт):

Автор решения: Евгений

Вот:

import requests
import re
from bs4 import BeautifulSoup as bs
import pandas as pd

URL_TEMPLATE = "https://www.artprice.com/artist/15079/wassily-kandinsky/lots/pasts?ipp=100"
FILE_NAME = "test"

def parse(url = URL_TEMPLATE):
    result_list = {'lot': [], 'name': [], 'date': [], 'type1': [], 'type2': [], 'width': [], 'height': [], 'auction_date': [], 'auction': [], 'country': []}
    r = requests.get(URL_TEMPLATE)
    soup = bs(r.text, "html.parser")
    lot_info = soup.find_all('p', class_='hidden-xs')
    date_info = soup.find_all('date')
    names_info = soup.find_all('a', class_='sln_lot_show')
    auction_info = soup.find_all('p', class_='visible-xs')
    auction_date_info = soup.find_all(string=re.compile('\d\d\s\w\w\w\s\d\d\d\d'))[1::2]
    my = soup.find_all('div',class_='col-xs-8 col-sm-6')
    for i in range(len(lot_info)):
        result_list['lot'].append(lot_info[i].text)
    for i in range(len(date_info)):
        result_list['date'].append(date_info[i].text)
    for i in range (len(names_info)):
        result_list['name'].append(names_info[i].text)
    for i in range(0, len(auction_info), 2):
        result_list['auction'].append(soup.find_all('p', class_='visible-xs')[i].strong.string)
    for i in range(1, len(auction_info), 2):
        result_list['country'].append(soup.find_all('p', class_='visible-xs')[i].string)
    for i in range(len(auction_date_info)):
        result_list['auction_date'].append(auction_date_info[i])
    for i in range(len(my)):
        all_p = my[i].find_all('p')
        lest = all_p[1].get_text().split(',')
        result_list['type1'].append(lest[0])
        result_list['type2'].append(lest[1])
        try:
            result_list['width'].append(all_p[1].find_all('span')[-1].get_text().replace('x','').replace('cm','').split()[0])
        except:
            result_list['width'].append('')
        try:
            result_list['height'].append(all_p[1].find_all('span')[-1].get_text().replace('x','').replace('cm','').split()[1])
        except:
            result_list['height'].append('')
    return result_list
df = pd.DataFrame(data=parse())
df
df.to_excel("test.xlsx")

В некоторых моментах бывает, что строка пустая, поэтому поставил try

→ Ссылка