迭代所有页面,并且搜寻器表的元素另存为Python中的数据框

发布时间:2020-07-07 14:13

我需要从此link循环访问所有页面的所有条目,然后单击红色部分的菜单check(请参见下图)以输入每个条目的详细信息:

enter image description here

目标是从下面的图像页面中获取信息,并将左侧部分保存为列名,右侧部分保存为行:

enter image description here

我使用的代码:

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

url = 'http://bjjs.zjw.beijing.gov.cn/eportal/ui?pageId=425000'
content = requests.get(url).text
soup = BeautifulSoup(content, 'lxml')
table = soup.find('table', {'class': 'gridview'})
df = pd.read_html(str(table))[0]
print(df.head(5))

出局:

   序号               工程名称  ...        发证日期 详细信息
0 NaN  假日万恒社区卫生服务站装饰装修工程  ...  2020-07-07   查看

用于进入详细页面的代码:

url = 'http://bjjs.zjw.beijing.gov.cn/eportal/ui?pageId=308891&t=toDetail&GCBM=202006202001'

content = requests.get(url).text
soup = BeautifulSoup(content, 'lxml')

table = soup.find("table", attrs={"class":"detailview"}).findAll("tr")
 
for elements in table:
    inner_elements = elements.findAll("td", attrs={"class":"label"})
    for text_for_elements in inner_elements:
        print(text_for_elements.text)

出局:

        工程名称:
        施工许可证号:
        所在区县:
        建设单位:
        工程规模(平方米):
        发证日期:
        建设地址:
        施工单位:
        监理单位:
        设计单位:
        行政相对人代码:
        法定代表人姓名:
        许可机关:

如您所见,我仅获得列名,没有成功提取任何条目。

为了循环所有页面,我认为我们需要使用发帖请求,但我不知道如何获取标题。

非常感谢您的帮助。

回答1

此脚本将遍历所有页面,并将数据获取到DataFrame中并将其保存到data.csv

!!!!!!!!!!!!!!!)。

import requests
import pandas as pd
from pprint import pprint
from bs4 import BeautifulSoup


url = 'http://bjjs.zjw.beijing.gov.cn/eportal/ui?pageId=425000'
payload = {'currentPage': 1, 'pageSize':15}

def scrape_page(url):
    soup = BeautifulSoup(requests.get(url).content, 'html.parser')
    return {td.get_text(strip=True).replace(':', ''): td.find_next('td').get_text(strip=True) for td in soup.select('td.label')}


all_data = []
current_page = 1

while True:
    print('Page {}...'.format(current_page))
    payload['currentPage'] = current_page
    soup = BeautifulSoup(requests.post(url, data=payload).content, 'html.parser')
    for a in soup.select('a:contains("查看")'):
        u = 'http://bjjs.zjw.beijing.gov.cn' + a['href']
        d = scrape_page(u)
        all_data.append(d)
        pprint(d)

    page_next = soup.select_one('a:contains("下一页")[onclick]')
    if not page_next:
        break

    current_page += 1

df = pd.DataFrame(all_data)
df.to_csv('data.csv')

将数据打印到屏幕上并保存data.csv(来自LibreOffice的屏幕截图):

enter image description here