循环页面,获取所有 ID 并将信息提取为 Python 中的数据框

Loop pages, get all the ids and extract infos as dataframe in Python

我需要循环此 link, then click into the details 个项目内容中的所有项目:

对于一个项目,它在.html前面有一个id,对于上面的link,id795189,所以我需要从第一个 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>

如何获取所有 ids、迭代网络、提取我需要的信息然后将它们保存为 Python 中的数据框?

非常感谢您的帮助。

更新:

获取ids:

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=["项目编号", "版本类型", "发布时间"])