Python BeautifulSoup解析的问题

问题描述 投票:0回答:1

我正试图解析一个 网页 与BeautifulSoup。任务是获取本页所有拍品的红色下划线数据,我从左侧和右侧块获取数据(关于拍品、拍卖名称、国家等),但从中央块获取数据似乎有问题。enter image description here 我从左边和右边的块中得到了数据(关于拍品,拍卖名称,国家等),但是从中央块中得到数据对我来说似乎是个问题。下面是所做的例子。

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]
    type1_info = soup.find_all('div')
    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")

所以,我们的任务是分别从中央块中获取本页中每个拍品的数据。

python parsing beautifulsoup html-parsing
1个回答
0
投票

你需要nth-of-type来访问所有这些数据 <p> 元素。

这只是对第一个元素进行了处理,以表明它是有效的。我将让你来清理输出。

for div in soup.find_all('div',class_='col-xs-8 col-sm-6'): 
    print(div.select_one('a').text.strip()) 
    print(div.select_one('p:nth-of-type(2)').text.strip()) 
    print(div.select_one('p:nth-of-type(3)').text.strip()) 
    print(div.select_one('p:nth-of-type(4)').text.strip()) 
    break 

结果:

Abstract
Print-Multiple, Print in colors, 29 1/2 x 31 1/2 in75 x 80 cm
Estimate:

              € 560 - € 784


              $ 605 - $ 848


              £ 500 - £ 700


              ¥ 4,303 - ¥ 6,025
Hammer price:
              not communicated
not communicated
not communicated
not communicated
© www.soinside.com 2019 - 2024. All rights reserved.