【问题标题】:How to create DataFrame with scraped data in python?如何在 python 中使用抓取的数据创建 DataFrame?
【发布时间】:2018-12-30 00:49:26
【问题描述】:

我正在尝试制作一个网络抓取工具,用于提取数据并将其分类到 pandas 数据框中。

我的所有代码:

import requests
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq
import numpy as np
import pandas as pd

class CaseCrawler:
    def __init__(self, starting_url, depth):
        self.starting_url = starting_url
        self.depth = depth
        self.cases = []

    def crawl(self):
        self.get_case_info(self.starting_url)
        return 

    def get_case_info(self, link):
        # opening up connection
        uClient = uReq(link)
        page_html = uClient.read()
        uClient.close()

        # html parsing
        page_soup = soup(page_html, "html.parser")

        case = page_soup.findAll("div", {"class":"bbWrapper"})


        for point in case:
            name = point.b.text
            body = point.text
            tag_block = page_soup.findAll("div", {"class":"blockStatus-message"})

            for tagger in tag_block:
                 tag_title = tagger.findAll("dl", {"class":"pairs pairs--columns pairs--spaced pairs--fixedSmall"})


        #pandas dataframe
        ##tag_df = pd.DataFrame(tag_title, index=tag_title.dt)
        print(tag_title[0])



        tag_df.to_csv("temp.csv")

crawler = CaseCrawler('https://www.yargikararlari.net/konu/iikya-gore-ortakligin-giderilmesi-davasi-acilabilmesi-icin-usulune-gore-borclu-ortagin-alacaklisi-iik-m-121.350/', 0)
crawler.crawl()

在代码的最后,我想用 pandas 抓取数据框中的一块信息

这是本网站的问题部分: 2rows 2columns

当我运行代码时,它会创建缩进且不必要的间隔 csv 文件:csv file

提前谢谢...

【问题讨论】:

  • 你能把输出的csv的内容贴出来吗? “缩进和不必要的间隔”并不能告诉我们足够的信息。另外,您能否尝试使用“lxml”作为传递者,并让我们知道这是否会产生不同的结果。
  • 我添加了 csv 文件。我对lxml不太了解。但我会试试的
  • 我现在知道问题出在哪里了,但是我需要一点时间来重新编写您的代码来解决它,请多多包涵。

标签: python pandas web-scraping beautifulsoup


【解决方案1】:

问题在于数据框的构建。 tag_title 是一个结果集,没有属性 dt。此外,您尝试抓取的页面中的代码也有很多无关的空白。正如我上面建议的那样,使用“lxml”作为您的传球手并更改线路:

tag_df = pd.DataFrame(tag_title, index=tag_title.dt)

    idx=[]
    dta=[]
    for title in tag_title:
        idx.append(title.find("dt").text)
        dta.append(title.find("dd").text.strip())
    tag_df = pd.DataFrame(dta, index=idx)

我认为你会更接近你想要的。

【讨论】:

  • 现在很好用,谢谢。但我需要问你:这是从那里抓取这些数据的最佳方式吗?而且你没有使用lxml,是吗?
  • 1.我确实使用了lxml。我,这是个人喜好,从不使用 html.parser。 2.我倾向于对网络抓取采取务实的态度,如果它有效,不要乱用它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多