如何从一个网站的多个 URL 中以一种有文化的方式将特定 table 数据 (div\tr\td) 提取到 CSV 中(附示例)

How to extract specific table data (div\tr\td) from multiple URLs in a website in a literate way into CSV (with sample)

我正在学习 python 并练习它以在 public 站点中提取数据。 但是我在这次学习中发现了一个问题。我想得到你的好心帮助我。 提前感谢您的帮助!我会每天跟踪这个话题,等待您的好评:)

用途:
在一个脚本中将所有 65 页的列、行及其内容提取到一个 csv 文件中

65 页 URL 循环规则:
http://fcjyw.dlhitech.gov.cn/ysxkzList.xhtml?method=doQuery&selYsxk=xmmc&txtkey=&pageNo=1
..........
http://fcjyw.dlhitech.gov.cn/ysxkzList.xhtml?method=doQuery&selYsxk=xmmc&txtkey=&pageNo=65

问题一:
当 运行ning 下面的一页脚本将一页数据提取到 csv 中时。我不得不用不同的文件名 运行 两次,然后数据可以提取到第一次 运行 文件 例如,如果我 运行 它与 test.csv,excel 保持 0kb 状态,在我将文件名更改为 test2 之后,然后再次 运行 这个脚本,之后数据可以提取到test.csv...,但 test2.csv 不保留 0 KB 的数据。有什么想法吗?

这里是一页提取码:

import requests
import csv
from bs4 import BeautifulSoup as bs
url = requests.get("http://fcjyw.dlhitech.gov.cn/ysxkzList.xhtml?method=doQuery&selYsxk=xmmc&txtkey=&pageNo=1")
soup = bs(url.content, 'html.parser')
filename = "test.csv"
csv_writer = csv.writer(open(filename, 'w', newline=''))
divs = soup.find_all("div", class_ = "iiright")
for div in divs:
         for tr in div.find_all("tr")[1:]:
            data = []
            for td in tr.find_all("td"):
                data.append(td.text.strip())
            if data:
                print("Inserting data: {}".format(','.join(data)))
                csv_writer.writerow(data)

问题2: 我发现读取 65 页 url 以将数据提取到 csv 中的问题。 它不起作用...任何想法修复它..

这里有65个页面url的提取码:

import requests
import csv
from bs4 import BeautifulSoup as bs
url = "http://fcjyw.dlhitech.gov.cn/ysxkzList.xhtml?method=doQuery&selYsxk=xmmc&txtkey=&pageNo={}"
def get_data(url):
      for url in [url.format(pageNo) for pageNo in range(1,65)]:
        soup = bs(url.content, 'html.parser')
        for div in soup.find_all("div", class_ = "iiright"):
            for tr in div.find_all("tr"):
                data = []
                for td in tr.find_all("td"):
                    data.append(td.text.strip())
                    if data:
                        print("Inserting data: {}".format(','.join(data)))
                        writer.writerow(data)
                
if __name__ == '__main__':
        with open("test.csv","w",newline="") as infile:
            writer = csv.writer(infile)
            get_data(url)

只是另一种方法

尽量保持简单,可以使用 pandas,因为它会在后台为您完成所有这些事情。

  1. 定义一个列表(数据)来保存您的结果
  2. 使用 pd.read_html
  3. 遍历 url
  4. concat data中的数据帧并写入to_csvto_excel
read_html
  1. 找到匹配字符串的 table -> match='预售信息查询:' 和 select 它与 [0] 因为 read_html() 总是会给你一个列表 tables
  2. 取特殊行作为headerheader =2
  3. 摆脱由于错误 colspan.iloc[:-1,:-1]
  4. 导致的最后一行导航和最后一列

例子

import pandas as pd

data = []

for pageNo in range(1,5):
    data.append(pd.read_html(f'http://fcjyw.dlhitech.gov.cn/ysxkzList.xhtml?method=doQuery&selYsxk=xmmc&txtkey=&pageNo={pageNo}', header =2, match='预售信息查询:')[0].iloc[:-1,:-1])

pd.concat(data).to_csv('test.csv', index=False)

示例(基于您的函数代码)

import pandas as pd

url = "http://fcjyw.dlhitech.gov.cn/ysxkzList.xhtml?method=doQuery&selYsxk=xmmc&txtkey="

def get_data(url):
    
    data = []

    for pageNo in range(1,2):
        data.append(pd.read_html(f'{url}&pageNo={pageNo}', header=2, match='预售信息查询:')[0].iloc[:-1,:-1])

    pd.concat(data).to_csv('test.csv', index=False)
                
if __name__ == '__main__':
    get_data(url)