雜記 › 技術筆記 › 從網頁複製的文字黏滿標籤?去掉 HTML 只留正文的做法

從網頁複製的文字黏滿標籤?去掉 HTML 只留正文的做法

上個月幫同事整理一份活動說明,他從公眾號後台的正文編輯器裡全選複製,貼到我這邊的文件裡。看著是三段話,實際上每句中間夾著 <p> 和 </p>,段落末尾還拖著一串 &nbsp;,行距被拉得很長。我用編輯器的清除格式功能清了一遍,標籤沒了,那批空白字元卻還留在原地,匯出 PDF 時行尾出現難看的參差。

這類事我遇過不止一次,後來才想明白:問題不在於「複製貼上」這個動作,而在於同一段內容其實有三種不同的存在形態,貼錯了形態就會拿到錯的字元。

同一段文字在系統裡有三種形態

第一種是渲染結果,也就是瀏覽器畫在螢幕上、你眼睛看到的版本:字級、行距、縮排都是樣式算出來的,複製時這些呈現層資訊不會被帶成可讀的文字。第二種是 HTML 原始碼,<strong>、<br>、<img> 這類標記是它的骨架,從「檢視網頁原始碼」裡拿到的就是這種。第三種是純文字,標籤全部消失,只剩字元本身。

貼上的目標軟體會自己去挑一份表示來用。挑中原始碼,標籤就變成正文裡的普通字元;挑中渲染結果,間距就按對方的樣式規則重排。我後來做的判斷很簡單:貼進去以後先用顯示不可列印字元看一眼,就知道自己拿到的是哪一種。

形態 裡面實際有什麼 貼進 Word 或程式碼裡會怎樣
渲染結果 看得見的內容與段落間距 間距由目標軟體的樣式決定,和原頁面對不上
HTML 原始碼 <p>、<br>、<div>、屬性、註解 <!-- --> 標籤被當成正文,字數虛高,字串常數直接截斷
實體寫法 &nbsp;、&quot;、&amp;、&ldquo; 引號顯示成 &quot;,程式碼裡雙引號提前閉合
純文字 只有字元與換行 結構資訊(層級、清單、強調)全部遺失

該留標籤的情境,和該清乾淨的情境

早期我一律清到底,後來發現這樣做會把有用的東西一起鏟掉。判斷依據我總結成一條:下游有沒有解析器。

如果這段文字最後要回到網頁、郵件範本、富文字編輯器,那 <p>、<ul>、<li> 不是垃圾,是內容結構的一部分。加粗表示強調、清單表示並列、表格表示對照,去掉之後讀者只能靠猜。這種情況下我寧可從原始碼裡只刪掉指定標籤:腳本、樣式、註解這些和正文無關的東西清走,剩下的標記原樣交回去。

反過來,如果下游只是人或檢索,我會清乾淨。典型有四種:進搜尋框做全文查找的正文;要貼回程式碼裡的字串常數;匯出成 CSV 或純文字存檔;以及給校對用的字數統計。這四種情境裡標籤只會製造噪音,尤其是程式碼裡,一個沒清乾淨的 < 會讓整行解析失敗。

我自己固定下來的處理順序

  1. 先確認拿到的是原始碼還是渲染結果,貼錯形態就別往下做了,重新複製。
  2. 決定標籤的命運:要回網頁就只移除指定標籤(比如把 script、style、div 單獨清掉),只給人讀就全部去掉只留文字,註解順手一併清除。
  3. 標籤去完,剩下的活基本上是空白字元。我用 HTML 標籤去除 處理標記,它可以只移除指定標籤名(比如 script、style、div),也可以全部去掉只留文字,註解能一併清除;連續空格和換行的壓縮我放到下一步,因為那一步對全形空格、定位字元、空行的選項更齊全。
  4. 實體字元單獨處理。別指望去標籤這一步會順手把 &nbsp; 解回正常空格,這是兩層事情;我看到 & 開頭的字串就記下來,留到實體解碼那一步再動。
  5. 最後用 文字清理 收邊,並拿 字數統計 核對一下處理前後的差值。

第五步不是形式主義。有一回我把整篇稿子壓成一行,差值算下來才發現段落分隔符也被吞了:正常清掉的應該是標籤字元數,如果連換行計數一起歸零,就說明清理選項開多了。數字對比是唯一能當場發現的辦法。

幾個我踩過的具體坑

公眾號後台的正文裡,縮排常常不是真空格而是一串 &nbsp;,去標籤工具不會替你把它變成普通空格,貼進程式碼裡就是一堆無法解釋的字元。

另一個坑是巢狀。想刪 <div> 時如果只按字串替換,屬性帶 class 的開標籤會漏掉,閉合標籤反而刪乾淨了,剩下的內容看著沒問題、貼到別處直接錯位。所以我現在更願意把指定標籤的刪除交給專門做這件事的工具,而不是手敲替換。

表格內容是最麻煩的一類。表格一旦被壓成純文字,列和欄的對應關係就靠肉眼維持,我見過從統計表裡複製出來貼進記事本、六欄資料糊成兩欄的例子。這種時候我會保留 HTML,或者乾脆把原始資料要成 CSV,標籤處理再乾淨也補不回結構。

Q:從網頁複製到 Word,標籤已經沒了,為什麼還有空格刪不掉?

因為那些不是普通空格。網頁裡大量使用不斷行空格和全形空格,Word 把它們顯示為空白但按字元計數,清除格式對它們無效。要按字元類型清,而不是按格式清。

Q:去標籤會不會影響文章的字數統計?

會影響「你看到的那份統計」,但不該影響正文本身。標籤字元本來就不屬於內容,去掉之後字數下降是正常的;如果下降幅度接近全文的一半,說明你刪的對象裡混了正文。

Q:只想刪掉腳本和樣式,正文標籤全留下,可行嗎?

可行,這正是指定標籤模式的用途。輸入標籤名即可,比如 script、style、div,其餘標記不動,處理完的內容還能直接貼回編輯器。

Q:能不能用尋找取代手工刪標籤?

少量可以,量大就別硬撐。尖括號在正規表達式裡有特殊含義,寫錯一個跳脫就刪多或刪少,而刪少表現為「看著乾淨」,很難在提交前被發現。

Q:處理 HTML 註解時要注意什麼?

註解裡經常留著上一版內容和內部備註,它們不影響顯示,所以人眼會漏。做正文擷取時把註解和標籤一起清掉更穩妥。

回到開頭那份活動說明:最後的成品既沒有標籤也沒有那串 & 開頭的字元,但我是在確認下游只要人讀之後才動手全刪的。同事後來還要一版貼回後台,那份我是從最初的原始碼只刪指定標籤得到的,結構保住了。同一批文字,兩個版本,取決於它們要去哪裡。

📎 相關文章

PNG 壓了三遍只減 426 位元組:無損壓縮的真實邊界 2026-10-22 WebP 轉 PNG 後體積漲了幾倍:什麼時候必須轉,怎麼把漲幅壓住 2026-10-22 截圖縮到四分之一,小字糊成一團的三種原因 2026-10-22 同樣裁 300×300,頭像為什麼總偏右下角半格 2026-10-22 按每月 1.7 倍預估 18 個月,腳本和表格為什麼給出兩個數 2026-10-22