使用 python 抓取网站时如何将 <br> 标签转换为逗号/新列?

and*_*lue 1 web-scraping python-3.x pandas

我正在尝试抓取下面的网站。我可以使用下面的代码从中获取我需要的所有数据。然而,“br”标签给我带来了问题。我希望将它们视为数据框中新列的指示器。

这是网站:directory.ccnecommunity.org/...

  • 我尝试了 BeautifulSoup 并得到了无效标签。效果不太好。
  • 我的想法是删除除“br”之外的所有标签,然后返回并用逗号替换它们。添加了太多其他废话,而不仅仅是纯文本。

代码:

url = 'http://directory.ccnecommunity.org/reports/rptAccreditedPrograms_New.asp?state=AL&sFullName=Alabama&sProgramType=1'
table = pd.read_html(url)
table = pd.concat(table[1:-1])
table.columns = table.iloc[0]
table = table.iloc[1:-1]
print(table)
Run Code Online (Sandbox Code Playgroud)

我希望表/学校部分中的每个缩进都是我的数据框中的一个新列。我可以稍后给它们命名并清理它们。我使用 selenium 来获取 URL,因为搜索页面是 java 脚本。使用硒来做到这一点会更好吗?我总是可以导出到 csv 并使用 pandas 读回它。任何帮助或提示将不胜感激。

Ben*_*Pap 5

import numpy as np
import pandas as pd
from bs4 import BeautifulSoup
import requests
import re


url = 'http://directory.ccnecommunity.org/reports/rptAccreditedPrograms_New.asp?state=AL&sFullName=Alabama&sProgramType=1'

page_html = requests.get(url).text
page_soup = BeautifulSoup(page_html, "html.parser")
tables  = page_soup.find_all("table", id = "finder")

reformattable = []
reg = re.compile(r"(<[\/]?br[\/]?>)+")
for table in tables:
    reformattable.append(re.sub(reg, "<td>", str(table)))

dflist = []
for table in reformattable:
    dflist.append(pd.read_html(str(table)))

info = [dflist[i][0] for i in np.arange(len(dflist))]
stats = [dflist[i][1] for i in np.arange(len(dflist))]

adjInfo = []
for df in info:
    adjInfo.append(pd.concat([df[i] for i in np.arange(len(df.columns))]).dropna().reset_index(drop = True))

adjStats= []
for df in stats:
    df.drop(columns = 1, inplace = True)
    df.dropna(inplace = True)
    df[3] = df[0]+' ' + df[2]
    adjStats.append(df[3])

combo = []
for p1,p2 in zip(adjInfo, adjStats):
    combo.append(pd.concat([p1,p2]))

finaldf = pd.concat([combo[i] for i in np.arange(len(combo))], axis = 1)

finaldf
Run Code Online (Sandbox Code Playgroud)

所以这正是您想要的。让我们回顾一下。

检查网站后,我们可以看到每个部分都是一个带有 finder id 的“表”。所以我们用漂亮的汤来寻找这个。接下来我们必须重新格式化标签<br>以使其更容易加载到 df 中。所以我<br>用一个<td>标签替换了所有标签。

该网站的另一个问题是每个部分都分为 2 个表格。所以我们每一节都有 2 个 df。为了使清理更容易,我将它们分解为信息和统计数据框列表。

adjInfo 和 adjStats 只是清理数据帧并将它们放入列表中。下周将每个部分的信息重新组合成单​​列,并将其组合起来。

最后,我们将所有列组合起来并将它们连接起来以获得最终的 df。

编辑

循环:

finaldf = pd.DataFrame()
for changeinurl in url:
    #fix it to however you manipulated the url for your loop
    url = 'http://directory.ccnecommunity.org/reports/rptAccreditedPrograms_New.asp?state=AL&sFullName=Alabama&sProgramType=1'

    page_html = requests.get(url).text
    page_soup = BeautifulSoup(page_html, "html.parser")
    tables  = page_soup.find_all("table", id = "finder")

    reformattable = []
    reg = re.compile(r"(<[\/]?br[\/]?>)+")
    for table in tables:
        reformattable.append(re.sub(reg, "<td>", str(table)))

    dflist = []
    for table in reformattable:
        dflist.append(pd.read_html(str(table)))

    info = [dflist[i][0] for i in np.arange(len(dflist))]
    stats = [dflist[i][1] for i in np.arange(len(dflist))]

    adjInfo = []
    for df in info:
        adjInfo.append(pd.concat([df[i] for i in np.arange(len(df.columns))]).dropna().reset_index(drop = True))

    adjStats= []
    for df in stats:
        df.drop(columns = 1, inplace = True)
        df.dropna(inplace = True)
        df[3] = df[0]+' ' + df[2]
        adjStats.append(df[3])

    combo = []
    for p1,p2 in zip(adjInfo, adjStats):
        combo.append(pd.concat([p1,p2]))

    df = pd.concat([combo[i] for i in np.arange(len(combo))], axis = 1).reset_index(drop = True).T

    finaldf.append(df)
Run Code Online (Sandbox Code Playgroud)