2017-08-17 1 views
2

Ich habe einige HTML und möchte einige Daten davon kratzen.Scrape html befindet sich direkt unter div

Die HTML wird in der folgenden Art und Weise strukturiert

<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> 

Ich muss in der Spanne liegt der Lage sein, den Textwert zu kratzen, wo class = „someOtherClass“ (Ich habe diesen Teil bereits umgesetzt) ​​

Ich muss dann in der Lage sein, den Tisch direkt unter dem div zu kratzen. Da das "Eltern" -Div die Tabelle nicht enthält, habe ich einige Probleme bei der Implementierung.

+2

Ihre html scheint nicht fehlerhaft zu sein. htmlagilitypacks HTMLDocument sollte in der Lage sein, die Strukturen zu finden, die Sie aus seinem DOM extrahieren möchten. Haben Sie das versucht? – James

+0

Wenn Sie immer noch Regex verwenden möchten - lesen Sie bitte alle Beiträge in https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/ zuerst. –

+0

@ EitanSeri-Levi - Ich habe Ihren Post bearbeitet, um das _regex_ -Tag und den Regex-Verbage im Post-Body zu entfernen. Bitte akzeptiere die Änderung. Erkenne, dass manche Leute nur bestimmte Tags und Titel überwachen. Bitte versuchen Sie in Zukunft vorsichtiger zu sein. Und ich glaube, es gibt ungefähr eine Million Duplikate von Xpath-Posts. Ich werde dies als ein Duplikat markieren, wenn ich Zeit habe. Viel Glück !! – sln

Antwort

4

Ich brauche den Text Wert der Lage sein, in der Spanne

Sie sich kratzen nicht regex müssen. Eine Xpath-Abfrage ist ausreichend.

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

Ich muß dann in der Lage sein, um die Tabelle direkt unter dem div zu kratzen.

eine ähnliche 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

Schöne Lösung –

+0

@sln Mach dir keine Sorgen. HtmlAgilityPack ist sehr resilient beim Parsing von fehlerhaften htmls :) –

+0

@sln Es sollte sein. Ich bin sicher, dass Sie diese berühmte Antwort bereits gelesen haben https://stackoverflow.com/a/1732454/932418 –

Verwandte Themen