csv 如何1)列表和提取特定的'li'标签在一个'ul'脚本在python与特定的标题和orga和2)出口他们在单独的列在excel

alen0pnh  于 2023-04-18  发布在  Python
关注(0)|答案(2)|浏览(77)

嗨,我正试图从一个漫画网站的网页刮一些数据。
感谢chitown88在这个article中的回答,我已经设法使用美丽的汤提取了一些细节,以及我提取的ul标签下的一些li值,但没有按照我想要的方式组织。
下面是我一直在使用的代码:

import requests
import pandas as pd
from bs4 import BeautifulSoup

url = 'https://www.bedetheque.com/serie-63733-BD-Champignac.html'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'}
page = requests.get(url, headers=headers)

soup = BeautifulSoup(page.content, 'html.parser')
lists = soup.find_all('div', class_="album-main")

data = []
for each in lists:
    extra = each.find('ul', {'class':'infos'})
    extra_lists = extra.find_all('li')

    row = {
        'Extra': [x.text.replace('\r', '').replace('\n', '').replace('\xa0', '') for x in extra_lists]
            }

    data.append(row)
        
df1 = pd.DataFrame(data)

df = pd.DataFrame([pd.Series(x) for x in df1.Extra])
df.columns = ['info_{}'.format(x+1) for x in df.columns]

df.to_csv('infos_albums.csv', index=False)

这是我得到:here is what I got
这是我想要的here is what I would like to have
我有很多漫画要刮,所有的页面都很相似,但有些小的特殊性避免我使用xpath方法。
所以如果有人能帮助我或者有更好的想法,那将是有帮助的(也许把所有的li放在某个变量中??)
谢谢,祝你有愉快的一天

eufgjt7s

eufgjt7s1#

下面是一个带有 regex(* 基于您的代码 *)的命题:

import re
from collections import defaultdict

pat= r"([^'\n:]+)\s*:\s*([^\n']*)"​
data = defaultdict(list)

for each in lists:
    extra_lists = each.find('ul', {'class':'infos'}).find_all('li')
    matches = re.findall(pat, '\n'.join([x.text for x in extra_lists]))

    for m in matches:
        data[m[0].strip()].append(re.sub(r'\s+', ' ', m[1].strip()))
    
df = pd.DataFrame.from_dict(data, orient='index').T

输出:

print(df)

  Identifiant Scénario        Dessin      Couleurs                       Dépot légal Achev. impr. Estimation Editeur        Format           ISBN Planches  Poids                                        Autres infos Autre image
0      354282     BéKa  Etien, David  Etien, David  01/2019 (Parution le 04/01/2019)      12/2018   non coté  Dupuis  Grand format  9782800174785       62  679 g  Créé le : 21/12/2018 (modifié le 07/03/2021 16:19)         Dos
1      413659     BéKa  Etien, David  Etien, David  02/2021 (Parution le 05/02/2021)      01/2021   non coté  Dupuis  Grand format  9791034749249       46  607 g  Créé le : 11/01/2021 (modifié le 07/03/2021 16:19)         Dos
2      467815     BéKa  Etien, David  Etien, David  04/2023 (Parution le 07/04/2023)      03/2023   non coté  Dupuis  Grand format  9791034768486       54   None  Créé le : 12/02/2023 (modifié le 07/04/2023 19:55)        None
laawzig2

laawzig22#

你可以用一种“通用”的方式来实现你的目标,使用stripped_strings,其中如果label包含:,则labellist中的第一个索引,否则你必须使用find_previous('label')

for ls in lists:
    d = {}
    for l in ls.select('.infos li'):
        if ':' not in l.label.text:
            d[l.find_previous('label').text[:-2]]=','.join([d[l.find_previous('label').text[:-2]], l.get_text(strip=True)])
        else:
            c = list(l.stripped_strings)
            d[c[0][:-2]]=','.join(c[1:])
    data.append(d)
示例
  • 当然,它可以改进以避免所有索引。
import requests
import pandas as pd
from bs4 import BeautifulSoup

url = 'https://www.bedetheque.com/serie-63733-BD-Champignac.html'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'}
page = requests.get(url, headers=headers)

soup = BeautifulSoup(page.content, 'html.parser')
lists = soup.find_all('div', class_="album-main")

data = []
         
for ls in lists:
    d = {}
    for l in ls.select('.infos li'):
        if ':' not in l.label.text:
            d[l.find_previous('label').text[:-2]]=','.join([d[l.find_previous('label').text[:-2]], l.get_text(strip=True)])
        else:
            c = list(l.stripped_strings)
            d[c[0][:-2]]=','.join(c[1:])
    data.append(d)

pd.DataFrame(data)
输出
标识符场景德桑库勒尔代波·莱加尔阿切夫改进估算编辑者格式ISBN普兰什波伊德其他信息克雷勒奥特尔像
0三五四二八二贝卡Etien,大卫Etien,大卫,Guivarc'h,Clémentine01/2019,(Parution le 04/01/2019)2018年12月非科特迪皮大格式9782800174785六十二679克2018年12月21日,(修改于2021年3月7日16:19)多斯
1个小行星413659贝卡Etien,大卫Etien,大卫02/2021,(Parution le 05/02/2021)2021年1月1日非科特迪皮大格式9791034749249四十六607克11/01/2021,(修改07/03/2021 16:19)多斯
四六七八一五贝卡Etien,大卫Etien,大卫,Olive,Céline2023年4月,(2023年4月7日)2023年3月非科特迪皮大格式9791034768486五十四12/02/2023,(修改07/04/2023 19:55)

相关问题