and*_*lue 1 web-scraping python-3.x pandas
我正在尝试抓取下面的网站。我可以使用下面的代码从中获取我需要的所有数据。然而,“br”标签给我带来了问题。我希望将它们视为数据框中新列的指示器。
这是网站:directory.ccnecommunity.org/...
代码:
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 读回它。任何帮助或提示将不胜感激。
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)
| 归档时间: |
|
| 查看次数: |
1073 次 |
| 最近记录: |