我正在學習 python 并練習它以在公共站點中提取資料。但是我在這次學習中發現了一個問題。我想得到你的幫助。提前感謝您的幫助!我將每天跟蹤此執行緒以等待您的友好評論:)
目的:
在一個腳本中將所有 65 頁的列、行和內容提取到 csv 中
65頁網址回圈規則:
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
問題 1:
在一頁腳本下運行以將一頁資料提取到 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)
uj5u.com熱心網友回復:
只是一種替代方法
盡量保持簡單并且可以使用pandas,因為它會在幕后為你做所有這些事情。
- 定義一個串列(資料)來保存你的結果
- 迭代網址
pd.read_html - 連接資料幀
data并寫入它們to_csv或to_excel
讀_html
- 找到與字串匹配的表 ->
match='預售資訊查詢:'并選擇它,[0]原因read_html()將始終為您提供表串列 - 將特殊行作為標題
header =2 - 擺脫了最后一排導航和最后一列由錯誤造成的
colspan與.iloc[:-1,:-1]
例子
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/321810.html
