Python中進行爬蟲數(shù)據(jù)清洗時,通常需要對從網(wǎng)頁中提取的原始數(shù)據(jù)進行處理,以去除無用信息、格式化數(shù)據(jù)、轉(zhuǎn)換數(shù)據(jù)類型等,以便于后續(xù)分析或存儲。以下是一些常用的數(shù)據(jù)清洗步驟和方法:
去除HTML標簽: 使用BeautifulSoup或lxml庫來解析HTML文檔,并提取所需的文本內(nèi)容。
from bs4 import BeautifulSoup
soup=BeautifulSoup(html_content, 'html.parser')
text_data=soup.get_text()
去除空白字符: 使用字符串的.strip()方法去除字符串兩端的空格、換行符和制表符。
cleaned_string=original_string.strip()
替換或刪除特定字符: 使用字符串的.replace()方法替換不需要的字符或字符串。
cleaned_string=original_string.replace('特定字符', '')
規(guī)范化文本: 使用正則表達式進行文本規(guī)范化,例如統(tǒng)一大小寫、移除HTML實體、標準化日期格式等。
import re
cleaned_string=re.sub(r'<[^>]+>', '', original_string) # 移除HTML標簽
cleaned_string=original_string.lower() # 統(tǒng)一小寫
數(shù)據(jù)類型轉(zhuǎn)換: 將字符串轉(zhuǎn)換為整數(shù)、浮點數(shù)或日期等適當?shù)臄?shù)據(jù)類型。
number=int(original_string)
date=datetime.strptime(original_date_string, '%Y-%m-%d')
去除重復數(shù)據(jù): 如果數(shù)據(jù)集中有重復的項,可以使用集合(set)或數(shù)據(jù)框架(pandas DataFrame)的去重功能來去除它們。
unique_data=list(set(original_data))
df=df.drop_duplicates() # pandas DataFrame去重
填充缺失值: 使用適當?shù)姆椒ㄌ畛鋽?shù)據(jù)集中的缺失值,如使用平均值、中位數(shù)或特定的占位符。
df['column']=df['column'].fillna(df['column'].mean())
數(shù)據(jù)規(guī)范化和標準化: 對數(shù)據(jù)進行規(guī)范化(歸一化)或標準化(z-score標準化),使其滿足后續(xù)算法的輸入要求。
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
df['normalized_column']=scaler.fit_transform(df[['column']])
編碼轉(zhuǎn)換: 對非英文或含有特殊字符的字符串進行編碼轉(zhuǎn)換,確保數(shù)據(jù)的一致性。
encoded_string=original_string.encode('utf-8').decode('utf-8')
數(shù)據(jù)清洗流程自動化: 使用pandas等庫提供的功能,將數(shù)據(jù)清洗流程自動化,并保存為可重用的腳本或函數(shù)。
import pandas as pd
def clean_data(df):
# 執(zhí)行數(shù)據(jù)清洗步驟
df.dropna(inplace=True)
df['column']=pd.to_numeric(df['column'], errors='coerce')
# ... 其他清洗步驟
return df
df_cleaned=clean_data(df_original)
數(shù)據(jù)清洗是一個迭代和不斷細化的過程,需要根據(jù)實際數(shù)據(jù)和業(yè)務需求不斷調(diào)整和優(yōu)化。在進行數(shù)據(jù)清洗時,建議保留原始數(shù)據(jù),以便必要時回溯或驗證清洗步驟。
相信很多朋友在開發(fā)和工作過程中都會使用MarkDown格式來編寫文檔,Markdown文檔的好處多多:
而在眾多的MarkDown文檔的編輯器中,我們比較常用的一款工具是Typora,前幾年是免費的,最近1.0正式版以后開始要收費了。
Typora容許隨時隨地開展無縫拼接瀏覽,從而可以在編輯的同時及時的看到效果。筆者現(xiàn)在寫這個文檔就是使用的這個工具。它有以下好處:
工具可以做到圖文并茂的編寫文檔,所有插入的圖片默認放在當前文檔的assets目錄下,也可以通過設置指定圖片保存的位置,使用起來很方便。
但不足的是,如果文檔進行了修改,圖片從文檔中刪除了,殘留在當前目錄下的assets目錄下的圖片并不會一同刪除。隨著文檔不斷的更新和修改,這個目錄下的圖片文件會越留越多,有時多達幾十M。不但占用空間,而且毫無用處。
雖然我們可以手動點擊每張圖片查看具體是哪張圖片,再一張張手工去刪除,但圖片如果多的話,也是很繁瑣的事情,而且考驗人的耐心。
我們能不能自己寫個程序,分析整個Markdown文檔中的圖片地址,然后批量刪除呢?有了這個想法以后,我就自己花了一些時間做了一個,目前已經(jīng)使用了一年多了,沒有發(fā)現(xiàn)什么問題,特意寫出來分享給大家。
首先我們需要分析Markdown文檔的格式,它本質(zhì)上就是一個文本文件。大致實現(xiàn)思路如下:
package org.newboy.utils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author NewBoy
* @version 1.0
* @since 2020-12-04
* 刪除MarkDown目錄下多余的圖片文件
*/
public class MarkDownPictureCleaner {
public static void main(String[] args) {
System.out.println("===MarkDown下冗余圖片清理工具(開發(fā)者:NewBoy 版本:1.0)===");
Scanner scanner=new Scanner(System.in);
//MarkDown的文件名
String path=null;
try {
System.out.println("請輸入Markdown文件的路徑和文件名(可直接將md文件拖到命令窗口):");
path=scanner.nextLine();
} catch (Exception e) { // 用戶可能按下 Ctrl + C 終止程序
System.out.println("程序結(jié)束!");
scanner.close();
System.exit(0);
}
// 預檢查,判斷用戶輸入的文件是否存在
File file=null;
//圖片所在目錄
String picDir=null;
if (StringUtils.isNotBlank(path)) {
//如果用戶在DOS命令窗口拖入,前后有雙引號,去掉雙引號
path=path.trim().replace("\"", "");
//創(chuàng)建文件對象
file=new File(path);
if (!file.exists()) {
System.out.println("Markdown文件不存在!");
file=null;
}
else {
System.out.println("請輸入圖片目錄(默認為assets):");
//圖片所在目錄
picDir=scanner.nextLine();
//如果為空,空串,或者空格
if (StringUtils.isBlank(picDir)) {
picDir="assets";
}
}
}
// 讀取 Markdown 文件的內(nèi)容
String content=null;
if (file !=null) { // 如果用戶輸入的文件不存在,跳過此次操作
System.out.println("您輸入的路徑:" + file.getAbsolutePath());
try {
content=FileUtils.readFileToString(file, "UTF-8");
} catch (IOException e) {
System.out.println("文件讀取異常:" + e.getMessage());
content=null;
}
}
if (content !=null) {
// 找出 Markdown 文件中所有圖片的引用
String regex="(!\\[.*\\])(\\(.*\\))|(<img\\b.*?(?:\\>|\\/>))"; // 捕獲組,匹配類似于 "" 的字符串
Pattern pattern=Pattern.compile(regex);
Matcher matcher=pattern.matcher(content);
HashSet<String> picturesInMarkdown=new HashSet<>();
while (matcher.find()) {
String ref=matcher.group(0);
String picture=null;
int beginIndex=0;
int endIndex=0;
//如果是!開頭
if (ref.startsWith("!")) {
// 獲取圖片名稱
beginIndex=ref.lastIndexOf("/") + 1;
endIndex=ref.length() - 1;
} else if (ref.startsWith("<")) { //或者以<開頭的
beginIndex=ref.indexOf("/") + 1;
endIndex=ref.indexOf('"', beginIndex);
}
picture=ref.substring(beginIndex, endIndex);
//logger.info(picture);
// 保存圖片名稱
picturesInMarkdown.add(picture);
}
System.out.println("MarkDown中一共有:" + picturesInMarkdown.size() + "個圖片文件");
// 列出 Markdown 文件所在目錄中的圖片名稱
File directory=file.getParentFile();
String[] extensions={"png", "jpg", "jpeg", "bmp"}; // 圖片擴展名
boolean recursive=true; // 不掃描子目錄
HashSet<String> picturesInDirectory=new HashSet<String>();
//獲取所有文件的集合
Collection<File> files=FileUtils.listFiles(directory, extensions, recursive);
System.out.println("圖片目錄下一共有:" + files.size() + "個圖片文件");
for (File picture : files) {
String name=picture.getName();
picturesInDirectory.add(name);
}
// 列出冗余圖片,并將其刪除
picturesInDirectory.removeAll(picturesInMarkdown);
int count=0;
for (String picture : picturesInDirectory) {
String pic=directory.getAbsolutePath() + File.separator + picDir + File.separator + picture;
System.out.println("刪除圖片:" + pic);
FileUtils.deleteQuietly(new File(pic));
count++;
}
System.out.println("操作完成,共刪除了" + count + "個圖片文件!");
}
scanner.close();
System.exit(0);
}
}
因為使用Java編寫,使用需要安裝Java虛擬機,為了方便用戶的使用,特意編寫了一個DOS下的命令行
@echo off
java -jar markdown-picture-cleaner-1.0.jar
pause
1.運行的時候會出現(xiàn)一個窗口,需要輸入Markdown文件的路徑和文件名,這個比較麻煩,但可以將需要清理的文件直接拖到窗口中,則會自動填充文件路徑和文件名
2.拖到窗口中會自動輸入路徑和文件名
3.按下回車會讓你輸入圖片的目錄,默認是當前目錄下的assets,如果圖片是在這個目錄下,直接按回車即可。
4.最后顯示清理的結(jié)果
以上是給各位讀者提供了一種思路,大家也可以使用其它語言進行編寫,比如可以直接運行在Windows下的VC或是VB,還有圖形界面,用戶體驗會更好一些。同時軟件本身只提供了基礎功能,作者提供了源代碼,懂Java的朋友可以在這個基礎上去進一步完善。
公中大家都會用到Word,但是在使用的過程中,我們或多或少會遇到一些問題。今天就挑出最典型的幾個問題,教你怎么解決它們。
1、插入圖片顯示不全
大家有沒有遇到這樣的情況,在Word中插入圖片后發(fā)現(xiàn),總是顯示不完整。這樣的情況要怎么解決呢?
解決方法:
其實這個問題解決起來也挺簡單的,只需要點擊段落旁邊的斜箭頭符號,進入「段落設置」中。
再將行距設置為「單倍行距」,點擊「確定」。
這樣一來,圖片完全顯示出來啦!開不開森?
2、圖片或圖形對象無法選擇
想要將Word中的圖片給刪除掉,但是卻發(fā)現(xiàn)無法選擇,怎么辦呢?
解決方法:
按「Ctrl + H」打開查找替換,點擊「更多」-「特殊格式」-「圖形」,把替換為設置為空,最后點擊「確定」,圖片就一次性清除啦!
1、表格超出頁面范圍
從網(wǎng)站或者Excel復制表格到Word,結(jié)果發(fā)現(xiàn)表格超出頁面范圍,部分內(nèi)容被遮擋了,怎么辦?
解決方法:
點擊表格左上角的按鈕,全選表格,右鍵選擇「自動調(diào)整」-「根據(jù)窗口自動調(diào)整表格」就可以啦!
2、Word表格轉(zhuǎn)Excel變形
Word和Excel都是辦公中經(jīng)常用到的工具,很多時候我們需要將Word中的表格給復制到Excel中,但是若復制過去變形了怎么辦呢?
解決方法:
首先,按「F12」鍵,將Word另存為HTML網(wǎng)頁格式。
然后右鍵點擊HTML文件,選擇「打開方式」為「Excel」,你就會發(fā)現(xiàn)表格顯示正常啦,不會變形。
1、超鏈接很難清除
你有沒有發(fā)現(xiàn),有時候我們在word中輸入網(wǎng)址或郵箱,它會變成一個藍色的鏈接,若是一個個去掉的話也挺麻煩的。那怎么將它們給批量去掉呢?
解決方法:
首先按「Ctrl + A」選中所有文本,然后按「Ctrl + 6」或者「Ctrl + Shift + 9」鍵,就可以讓所有超鏈接消失啦!
2、空白段落很多如何清除
一般從網(wǎng)上復制文本到Word中,都會出現(xiàn)很多空白段落,看起來不好看,怎么將它們一次性去除呢?
解決方法:
按「Ctrl + H」打開替換框,查找內(nèi)容輸入2個「^p」,替換內(nèi)容輸入1個,全部替換,OK。
好啦,以上就是Word使用中的幾個技巧了,你們學會了嗎?
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。