2011-04-19 42 views
2

我有包含約1000條微博的HTML源代碼(每行一條推文)。大多數推文如下所示。我正在使用delphi備忘錄嘗試使用Pos函數和刪除函數去除HTML標記,但失敗了。如何從這種類型的html源文件中提取文本?

<div id='tweetText'> RT <a onmousedown="return touch(this.href,0)" href="http://twitter.com/HighfashionUK">@HighfashionUK</a> RT: Surprise goody bag up 4 grabs, Ok. <a onmousedown="return touch(this.href,0)" href="http://plixi.com/p/57846587">http://plixi.com/p/57846587</a> when we get 150</div> 

我想要去除HTML標記和只有:

RT: Surprise goody bag up 4 grabs, Ok. http://plixi.com/p/57846587 when we get 150 

我怎樣才能提取德爾福這樣的文本?

非常感謝您提前。

更新:

科斯明Prund是正確的。我錯誤地跳過了一部分。我想要的是:

RT @HighfashionUK RT: Surprise goody bag up 4 grabs, Ok. http://plixi.com/p/57846587 when we get 150 

Cosmin Prund很棒。

+0

你確定你不能只使用Twitter API嗎? – 2011-04-19 13:56:36

+0

你想要提取什麼?您似乎只想要文本(即:忽略所有標籤),但您跳過了第一個定位標籤(@HighfashionUK)的內部文本。那是故意的還是錯誤的? – 2011-04-19 14:00:46

+1

在關閉'dupe'之前:如果OP想要刪除所有HTML標記並僅保留文本,這不是一個騙局。您無需解析HTML即可完成此操作。 – 2011-04-19 14:13:42

回答

5

因爲所有的HTML標記都在<>之間,所以剝離標記的例程可以這樣平凡地書寫。希望這是你想要的,因爲正如你在我的評論中看到的那樣,@HighfashionUK有一個問題 - 你的例子跳過了,不知道爲什麼。

function StripHtmlMarkup(const source:string):string; 
var i, count: Integer; 
    InTag: Boolean; 
    P: PChar; 
begin 
    SetLength(Result, Length(source)); 
    P := PChar(Result); 
    InTag := False; 
    count := 0; 
    for i:=1 to Length(source) do 
    if InTag then 
     begin 
     if source[i] = '>' then InTag := False; 
     end 
    else 
     if source[i] = '<' then InTag := True 
     else 
     begin 
      P[count] := source[i]; 
      Inc(count); 
     end; 
    SetLength(Result, count); 
end; 
+0

非常感謝。查看我的更新。但爲什麼你說「你不需要解析HTML就可以做到這一點」。還有其他方法可以做到嗎? – Warren 2011-04-19 15:25:50

+0

是否有用於delphi的html解析器(庫/組件)? – Warren 2011-04-19 15:56:26

+0

@Warren,HTML解析器通常會讀取*並理解所有HTML標記,生成文檔樹或DOM(文檔對象模型)。你可以遍歷樹並提取所有文本,但是一旦你有一個DOM,你也可以做更聰明的事情,比如提取錨的「href」,或者忽略某些標記。我的方法沒有任何特定於HTML的知識,它只知道標籤以'<開始並以'>'結尾,它應該忽略標記之間的所有內容。它是快速和有效的,但不如完整的DOM解析器強大。 – 2011-04-21 13:12:27