2017-08-03 17 views
1

我使用HTMLAgiltyPack提取發送給我們的查詢中嵌入的電子郵件地址。有問題的HTML部分是以下形式:使用HtmlAgilityPack的InnerText提取電子郵件時保留換行符

<div class="queryBody"> 
<span> 
    ****Query here**** 
    MAY contain paragraphs and lists tags. 
</span> 
</div> 

這是我的代碼:

string query = queryHtml.DocumentNode.SelectNodes(
       @"//div[@class='queryBody'] 
       /span")[0].InnerText; 
string pattern = @"([\w.]+)@([\w.]+)\.([a-z]+)"; 
Match match = Regex.Match(par, pattern); 
string email = ""; 
if (match.Success) 
{ 
    email = match.Value; 
} 

<span>內的HTML包含段落和列表時出現了問題。在這種情況下,query將返回一個大字符串,其中省略了<p><li>的所有換行符。

例子:

<div class="queryBody"> 
    <span> 
    <p>I am unable to log into my account</p> 
    <p>Please help me sort out this problem</p> 
    <p>My email is: [email protected]</p> 
    <p>cell: 021901493</p> 
    </span> 
</div> 

query將返回:

I am unable to log into my accountPlease help me sort out this problemMy email is: [email protected]: 021901493 

這使得它非常難用我的正則表達式來提取電子郵件地址。有什麼方法可以在使用HtmlAgilityPack遍歷HTML節點時保留換行符?還有什麼可以成功提取電子郵件地址的嗎?

+0

我不能repro。我得到所有換行符,結果是'rebecca.h @ gmail.com'。如果原始HTML中沒有換行符,那麼我可以重新制作。 –

回答

0

如果只有一個電子郵件提取,你可以使用

var query = queryHtml.DocumentNode.SelectNodes(
      @"//div[@class='queryBody'] 
      /span"); 
var pattern = @"\[email protected]\S+\.\S+"; 
var email = ""; 
if (query != null) 
{ 
    var emailNode = query.Descendants().Where(m => Regex.IsMatch(m.InnerText, pattern)).FirstOrDefault(); 
    if (emailNode != null) 
    { 
     email = Regex.Match(emailNode.InnerText, pattern).Value; 
    } 
} 

點被發現的電子郵件模式相匹配的後代節點(注意:我使用了它一個更通用的模式,匹配1+非空格,@,1 +非空格,.,再1+非空格),然後提取該匹配。

您可以通過收集與模式匹配的所有節點,然後使用Regex.Matches來獲取所有模式匹配,輕鬆地調整多封電子郵件的代碼。

0

你的正則表達式使用原始html,所以我只會使用InnerHtml而不是InnerText。代碼將會是。

string query = queryHtml.DocumentNode.SelectNodes(
       @"//div[@class='queryBody'] 
       /span")[0].InnerHtml; 
string pattern = @"([\w.]+)@([\w.]+)\.([a-z]+)"; 
Match match = Regex.Match(par, pattern); 
string email = ""; 
if (match.Success) 
{ 
    email = match.Value; 
} 

這將讓該地址正確,因爲 '<' 是不是在[A-Z]。那麼如果你有一些原因需要使用InnerText,那麼我只需要創建一個單獨的變量。