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