循环页面,获取所有 ID 并将信息提取为 Python 中的数据框
Loop pages, get all the ids and extract infos as dataframe in Python
我需要循环此 link, then click into the details 个项目内容中的所有项目:
对于一个项目,它在.html
前面有一个id
,对于上面的link,id
是795189
,所以我需要从第一个 link.
的所有项目中获取所有 id
我的objective是进入每个项目并从下面的table下载信息作为数据框。
这是我到目前为止使用的代码,它还没有循环所有 id
并提取 table 部分:
import requests
import json
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
data = []
url = 'https://www.china0001.com.cn/project/795398.html'
website_url = requests.get(url).text
soup = BeautifulSoup(website_url, 'lxml')
for row in soup.findAll("tr"):
cols = row.findAll("td")
# print(cols)
cols = [ele.text.strip() for ele in cols]
data.append([ele for ele in cols if ele])
print(data)
部分输出:
[<td align="left" class="pd20 showchange">
<b class="change_title">项目编号</b>:ZC0000218734
</td>, <td align="left" class="showchange">
<b>版本类型</b>: 第4版本
</td>, <td align="left" class="showchange">
<b class="change_title">发布时间</b>:2020-07-06
</td>]
[<td align="left" class="pd20 showchange">
<b class="change_title">项目类型</b>:新建工程 </td>, <td align="left" class="showchange">
<b class="change_title">建设周期</b>: 2019...
</td>, <td align="left" class="showchange">
<b class="change_title"> 工程造价</b>:7000万 </td>]
[<td align="left" class="pd20 showchange">
<b class="change_title">项目规模</b>:中型项目 </td>, <td align="left" class="showchange">
<b class="change_title">项目阶段</b>: 施工建设 </td>, <td align="left" class="showchange">
<b class="change_title"> 甲方类型</b>:国资 </td>]
[<td align="left" class="pd20 showchange">
<b class="change_title">占地面积</b>:27846平米
</td>, <td align="left" class="showchange">
<b class="change_title">建筑面积</b>: 60117.00平米 </td>, <td align="left" class="showchange">
<b class="change_title">供暖方式</b>:未确定 </td>]
[<td align="left" class="pd20 showchange">
<b class="change_title">所属行业</b>:<a href="/project/f70/" target="_blank">住宅建筑</a>/<a href="/project/f67/" target="_blank">停车场建筑</a>
</td>, <td align="left" class="showchange">
<b class="change_title">省/直辖市</b>:<a href="/project/d18/">浙江</a>
</td>, <td align="left" class="showchange">
<b class="change_title">市/区</b>:<a href="/project/ct128/">丽水市</a>
</td>]
[<td align="left" class="pd20 showchange">
<b class="change_title">电梯</b>:
未确定
</td>, <td align="left" class="showchange">
<b class="change_title">空调</b>: 未确定
</td>, <td align="left" class="showchange">
<b class="change_title"> 外墙材料</b>:未确定
</td>]
[<td align="left" class="pd20 showchange">
<b class="change_title">所属专题</b>:<a href="/project/k6/" target="_blank">停车场专题项目</a>
</td>, <td align="left" class="showchange" colspan="2">
<b class="change_title"> 项目地址</b>:浙江丽水市...
</td>]
[<td align="left" class="pd20" colspan="3" style="padding: 0;">
<div class="rmktitle"><img alt="" src="/Public/newhome/img/icon_xq/icon_gaikuang.png"/><b>项目概况</b> <a class="demo" href="/project/demo.html" target="_blank"><span style="color:#fff;">[工程项目信息样例]<span></span></span></a></div>
</td>]
[<td align="left" colspan="3">
<div class="rmktxt">
1.项目位于联城路与白前路交叉口东北侧地块,用地面积27846平方米,其中居住用地面积23847平方米,公共绿地面积3999平方米,总建筑面积暂估为60117平方米(其中地上建筑面积为44117平方米... <a class="login-btn" href="javascript:">点击查看详情</a>
</div>
如何获取所有 id
s、迭代网络、提取我需要的信息然后将它们保存为 Python 中的数据框?
非常感谢您的帮助。
更新:
获取id
s:
url = 'https://www.china0001.com.cn/project/b1-p3/'
website_url = requests.get(url).text
soup = BeautifulSoup(website_url, 'lxml')
# project_href = [i['href'] for i in soup.find_all('a', href=True)]
# print(project_href)
for link in soup.findAll('a', href=True):
# print(link)
print(link['href'])
输出:
/project/795546.html
/project/795542.html
/project/795531.html
/project/795525.html
/project/795519.html
/project/795516.html
/project/795514.html
/project/795505.html
/project/795492.html
/project/795478.html
/project/795474.html
/project/795460.html
/project/795458.html
/project/795446.html
/project/795445.html
/project/795440.html
/project/795436.html
/project/795433.html
/project/795430.html
/project/795429.html
/project/795427.html
/project/795426.html
/project/795416.html
/project/795410.html
/project/795404.html
/project/795398.html
/project/795393.html
/project/795390.html
/project/795386.html
/project/795385.html
根据 Bigbounty 的回答更新:
import requests
import json
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
data = []
url = 'https://www.china0001.com.cn/project/795398.html'
website_url = requests.get(url).text
soup = BeautifulSoup(website_url, 'lxml')
tbody = soup.find("table", attrs={"id":"mse_new"}).find("tbody", attrs={"class":"jg"})
tr = tbody.find_all("tr")
rows = []
for i in tr[1:]:
# print(i)
rows.append([j.text.strip() for j in i.findAll("td")])
print(rows)
out = dict([map(str.strip, y.split(':')) for x in rows for y in x])
df = pd.DataFrame([out])
print(df)
使用以下脚本将 table 提取到 DataFrame
import requests
import json
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
data = []
url = 'https://www.china0001.com.cn/project/795398.html'
website_url = requests.get(url).text
soup = BeautifulSoup(website_url, 'lxml')
tbody = soup.find("table", attrs={"id":"mse_new"}).find("tbody", attrs={"class":"jg"})
tr = tbody.find_all("tr")
rows = []
for i in tr[1:]:
rows.append([j.text.strip() for j in i.findAll("td")])
df = pd.DataFrame(rows)
输出:
0 1 2
0 项目编号:ZC0000218734 版本类型: 第4版本 发布时间:2020-07-06
1 项目类型:新建工程 建设周期: 2019... 工程造价:7000万
2 项目规模:中型项目 项目阶段: 施工建设 甲方类型:国资
3 占地面积:27846平米 建筑面积: 60117.00平米 供暖方式:未确定
4 所属行业:住宅建筑/停车场建筑 省/直辖市:浙江 市/区:丽水市
5 电梯:\n 未确定 空调: 未确定 外墙材料:未确定
6 所属专题:停车场专题项目 项目地址:浙江丽水市... None
更新:
设置列名
pd.DataFrame(rows, columns=["项目编号", "版本类型", "发布时间"])
我需要循环此 link, then click into the details 个项目内容中的所有项目:
对于一个项目,它在.html
前面有一个id
,对于上面的link,id
是795189
,所以我需要从第一个 link.
id
我的objective是进入每个项目并从下面的table下载信息作为数据框。
这是我到目前为止使用的代码,它还没有循环所有 id
并提取 table 部分:
import requests
import json
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
data = []
url = 'https://www.china0001.com.cn/project/795398.html'
website_url = requests.get(url).text
soup = BeautifulSoup(website_url, 'lxml')
for row in soup.findAll("tr"):
cols = row.findAll("td")
# print(cols)
cols = [ele.text.strip() for ele in cols]
data.append([ele for ele in cols if ele])
print(data)
部分输出:
[<td align="left" class="pd20 showchange">
<b class="change_title">项目编号</b>:ZC0000218734
</td>, <td align="left" class="showchange">
<b>版本类型</b>: 第4版本
</td>, <td align="left" class="showchange">
<b class="change_title">发布时间</b>:2020-07-06
</td>]
[<td align="left" class="pd20 showchange">
<b class="change_title">项目类型</b>:新建工程 </td>, <td align="left" class="showchange">
<b class="change_title">建设周期</b>: 2019...
</td>, <td align="left" class="showchange">
<b class="change_title"> 工程造价</b>:7000万 </td>]
[<td align="left" class="pd20 showchange">
<b class="change_title">项目规模</b>:中型项目 </td>, <td align="left" class="showchange">
<b class="change_title">项目阶段</b>: 施工建设 </td>, <td align="left" class="showchange">
<b class="change_title"> 甲方类型</b>:国资 </td>]
[<td align="left" class="pd20 showchange">
<b class="change_title">占地面积</b>:27846平米
</td>, <td align="left" class="showchange">
<b class="change_title">建筑面积</b>: 60117.00平米 </td>, <td align="left" class="showchange">
<b class="change_title">供暖方式</b>:未确定 </td>]
[<td align="left" class="pd20 showchange">
<b class="change_title">所属行业</b>:<a href="/project/f70/" target="_blank">住宅建筑</a>/<a href="/project/f67/" target="_blank">停车场建筑</a>
</td>, <td align="left" class="showchange">
<b class="change_title">省/直辖市</b>:<a href="/project/d18/">浙江</a>
</td>, <td align="left" class="showchange">
<b class="change_title">市/区</b>:<a href="/project/ct128/">丽水市</a>
</td>]
[<td align="left" class="pd20 showchange">
<b class="change_title">电梯</b>:
未确定
</td>, <td align="left" class="showchange">
<b class="change_title">空调</b>: 未确定
</td>, <td align="left" class="showchange">
<b class="change_title"> 外墙材料</b>:未确定
</td>]
[<td align="left" class="pd20 showchange">
<b class="change_title">所属专题</b>:<a href="/project/k6/" target="_blank">停车场专题项目</a>
</td>, <td align="left" class="showchange" colspan="2">
<b class="change_title"> 项目地址</b>:浙江丽水市...
</td>]
[<td align="left" class="pd20" colspan="3" style="padding: 0;">
<div class="rmktitle"><img alt="" src="/Public/newhome/img/icon_xq/icon_gaikuang.png"/><b>项目概况</b> <a class="demo" href="/project/demo.html" target="_blank"><span style="color:#fff;">[工程项目信息样例]<span></span></span></a></div>
</td>]
[<td align="left" colspan="3">
<div class="rmktxt">
1.项目位于联城路与白前路交叉口东北侧地块,用地面积27846平方米,其中居住用地面积23847平方米,公共绿地面积3999平方米,总建筑面积暂估为60117平方米(其中地上建筑面积为44117平方米... <a class="login-btn" href="javascript:">点击查看详情</a>
</div>
如何获取所有 id
s、迭代网络、提取我需要的信息然后将它们保存为 Python 中的数据框?
非常感谢您的帮助。
更新:
获取id
s:
url = 'https://www.china0001.com.cn/project/b1-p3/'
website_url = requests.get(url).text
soup = BeautifulSoup(website_url, 'lxml')
# project_href = [i['href'] for i in soup.find_all('a', href=True)]
# print(project_href)
for link in soup.findAll('a', href=True):
# print(link)
print(link['href'])
输出:
/project/795546.html
/project/795542.html
/project/795531.html
/project/795525.html
/project/795519.html
/project/795516.html
/project/795514.html
/project/795505.html
/project/795492.html
/project/795478.html
/project/795474.html
/project/795460.html
/project/795458.html
/project/795446.html
/project/795445.html
/project/795440.html
/project/795436.html
/project/795433.html
/project/795430.html
/project/795429.html
/project/795427.html
/project/795426.html
/project/795416.html
/project/795410.html
/project/795404.html
/project/795398.html
/project/795393.html
/project/795390.html
/project/795386.html
/project/795385.html
根据 Bigbounty 的回答更新:
import requests
import json
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
data = []
url = 'https://www.china0001.com.cn/project/795398.html'
website_url = requests.get(url).text
soup = BeautifulSoup(website_url, 'lxml')
tbody = soup.find("table", attrs={"id":"mse_new"}).find("tbody", attrs={"class":"jg"})
tr = tbody.find_all("tr")
rows = []
for i in tr[1:]:
# print(i)
rows.append([j.text.strip() for j in i.findAll("td")])
print(rows)
out = dict([map(str.strip, y.split(':')) for x in rows for y in x])
df = pd.DataFrame([out])
print(df)
使用以下脚本将 table 提取到 DataFrame
import requests
import json
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
data = []
url = 'https://www.china0001.com.cn/project/795398.html'
website_url = requests.get(url).text
soup = BeautifulSoup(website_url, 'lxml')
tbody = soup.find("table", attrs={"id":"mse_new"}).find("tbody", attrs={"class":"jg"})
tr = tbody.find_all("tr")
rows = []
for i in tr[1:]:
rows.append([j.text.strip() for j in i.findAll("td")])
df = pd.DataFrame(rows)
输出:
0 1 2
0 项目编号:ZC0000218734 版本类型: 第4版本 发布时间:2020-07-06
1 项目类型:新建工程 建设周期: 2019... 工程造价:7000万
2 项目规模:中型项目 项目阶段: 施工建设 甲方类型:国资
3 占地面积:27846平米 建筑面积: 60117.00平米 供暖方式:未确定
4 所属行业:住宅建筑/停车场建筑 省/直辖市:浙江 市/区:丽水市
5 电梯:\n 未确定 空调: 未确定 外墙材料:未确定
6 所属专题:停车场专题项目 项目地址:浙江丽水市... None
更新:
设置列名
pd.DataFrame(rows, columns=["项目编号", "版本类型", "发布时间"])