2017-08-17 50 views
2

我有一些HTML,並希望從中抓取一些數據。刮直接位於div下面的div

的HTML按以下方式構造

<div class="someClass"><span class="someOtherClass">Text</span></div> 

<table> 
    <tbody> 
    <tr> 
     <td>label</td> 
     <td>data</td> 
    </tr> 
    <tr> 
     <td>label</td> 
     <td>data</td> 
    </tr> 
    <tr> 
     <td>label</td> 
     <td>data</td> 
    </tr> 
    </tbody> 
</table> 

<div class="someClass"><span class="someOtherClass">Text</span></div> 
     <table> 
    <tbody> 
    <tr> 
     <td>label</td> 
     <td>data</td> 
    </tr> 
    <tr> 
     <td>label</td> 
     <td>data</td> 
    </tr> 
    <tr> 
     <td>label</td> 
     <td>data</td> 
    </tr> 
    </tbody> 
</table> 
<div class="someClass"><span class="someOtherClass">Text</span></div> 

我需要能夠刮掉位於跨度文本值,其中類=「someOtherClass」(我已經實現了這個部分)

然後我需要能夠直接在div下面刮表。由於「父」div實際上並不包含表,所以我在實現這個時遇到了一些問題。

+2

你的HTML不似乎是畸形的。 htmlagilitypack的HTMLDocument應該能夠找到你想要從DOM中提取的結構,你試過了嗎? – James

+0

如果你仍然想使用正則表達式 - 請先閱讀https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/中的所有文章。 –

+0

@ EitanSeri-Levi - 我編輯了你的帖子,刪除帖子正文中的_regex_標籤和正則表達式verbage。請接受編輯。意識到雖然有些人只監視某些標籤和標題。請儘量在將來更小心。我確實相信大約有一百萬個Xpath帖子的重複。當我有時間時,我會將其標記爲重複。祝你好運 !! – sln

回答

4

我需要能夠刮掉位於跨度

你不需要正則表達式的文本值。一個Xpath查詢就足夠了。

var text = doc.DocumentNode 
      .SelectNodes("//span[@class='someOtherClass']") 
      .Select(x => x.InnerText) 
      .ToList(); 

然後我需要能夠湊正下方的DIV表。

使用類似的XPath

var doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(htmlstring); 

var tables = doc.DocumentNode 
      .SelectNodes("//span[@class='someOtherClass']/following::table").ToList(); 
foreach (var table in tables) 
{ 
    var list = table.Descendants("tr") 
        .Select(tr => tr.Descendants("td") 
        .Select(td => td.InnerText).ToList()) 
        .ToList(); 
} 
+0

英俊的解決方案 –

+0

@sln別擔心。 HtmlAgilityPack在解析格式錯誤的htmls方面非常出色:) –

+0

@sln它應該是。我相信你已經閱讀這個着名的答案https://stackoverflow.com/a/1732454/932418 –