【问题标题】:Scraping paginated web table with python pandas & beautifulSoup使用 python pandas 和 beautifulSoup 抓取分页 web 表
【发布时间】:2018-12-09 16:51:26
【问题描述】:

我是 python pandas 的初学者,我正在尝试使用漂亮的汤包来废弃分页表,数据被抓取,但每个单元格的内容都在一行中,我无法获得连贯的 csv 文件

这是我的代码:

import urllib
import urllib.request
from bs4 import BeautifulSoup
import os

file=open(os.path.expanduser("sites_commerciaux.csv"), "wb")

def make_soup(url):
    thepage=urllib.request.urlopen(url)
    soupdata=BeautifulSoup(thepage,"html.parser")
    return soupdata


headers="Nom_commercial_du_Site,Ville,Etat,Surface_GLA,Nombre_de_boutique,Contact"
file.write(bytes(headers,encoding='ascii',errors='ignore'))
save=""
for num in range(0,22): 
    soup=make_soup("http://www.ceetrus.com/fr/implantations-sites-commerciaux?page="+str(num))
    for rec in soup.findAll('tr'):
        saverec=""
        for data in rec.findAll('td'):
            saverec=saverec+","+data.text
            if len(saverec)!=0:
             save=save+"\n"+saverec[1:]

file.write(bytes(save,encoding='ascii',errors='ignore'))

谁能帮我解决一下

【问题讨论】:

    标签: python string for-loop


    【解决方案1】:

    我做了一些清洁工作。首先,为什么是字节类型?你在写文字。那为什么是ASCII?请使用 Unicode。如果稍后在您的代码中,您真的需要将 ascii 编码为 ascii。不推荐使用findAll,请使用find_all。表面值中的逗号也可能存在问题。最后,尽可能使用上下文管理器(这里:使用文件)

    现在对于您的问题,您遇到了两个问题:

    1. 您的测试 if len(saverec)!=0: 在 for 循环中,生成批次 无用数据。
    2. 您没有去除数据中不需要的空格

    .

    import urllib
    import urllib.request
    from bs4 import BeautifulSoup
    import os
    
    
    def make_soup(url):
        thepage=urllib.request.urlopen(url)
        soupdata=BeautifulSoup(thepage,"html.parser")
        return soupdata
    
    
    save=""
    for num in range(0, 22):
        soup=make_soup("http://www.ceetrus.com/fr/implantations-sites-commerciaux?page="+str(num))
        for rec in soup.find_all('tr'):
            saverec=""
            for data in rec.find_all('td'):
                data = data.text.strip()
                if "," in data:
                    data = data.replace(",", "")
                saverec=saverec+","+data
            if len(saverec)!=0:
             save=save+"\n"+saverec[1:]
        print('#%d done' % num)
    
    headers="Nom_commercial_du_Site,Ville,Etat,Surface_GLA,Nombre_de_boutique,Contact"
    with open(os.path.expanduser("sites_commerciaux.csv"), "w") as csv_file:
        csv_file.write(headers)
        csv_file.write(save)
    

    第一页的输出:

    Nom_commercial_du_Site,Ville,Etat,Surface_GLA,Nombre_de_boutique,Contact
    ALCORCÓN,ALCORCÓN - MADRID,Ouvert,4298 m²,40,José Carlos GARCIA
    Alegro Alfragide,CARNAXIDE,Ouvert,11461 m²,122,
    Alegro Castelo Branco,CASTELO BRANCO,Ouvert,6830 m²,55,
    Alegro Setúbal,Setúbal,Ouvert,27000 m²,114,
    Ancona,Ancona,Ouvert,7644 m²,41,Ettore PAPPONETTI
    Angoulême La Couronne,LA COURONNE,Ouvert,6141 m²,45,Juliette GALLOUEDEC
    Annecy Grand Epagny,EPAGNY,Ouvert,20808 m²,61,Delphine BENISTY
    Anping,Tainan,Ouvert,969 m²,21,Roman LEE
    АКВАРЕЛЬ,Volgograd,Ouvert,94025 m²,182,Viktoria ZAITSEVA
    Arras,ARRAS,Ouvert,4000 m²,26,Anais NIZON
    

    【讨论】:

    • 非常感谢@bobrobbob,我刚刚添加了“encoding="utf-16",并且我在 csv 文件中很好地组织了所有数据。你能给我发电子邮件吗?:tc.nada@ yahoo.fr
    • @NadaTc Stack Overflow 不是这样工作的。我们不是来修复您的代码,也不是私下帮助您这样做。
    • 对于@bobrobbob,请在您的 Stack Overflow 问题和答案中练习正确使用语法。你的 shift 键坏了吗……?
    猜你喜欢
    • 1970-01-01
    • 2016-09-05
    • 2017-04-15
    • 2021-06-23
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多