HtmlAgilityPack - Come leggere determinate tabelle - c # 4.0

c# html-agility-pack

Domanda

Con l'uso di c # 4.0 e htmlagilitypack come posso leggere i valori all'interno di determinate tabelle. Voglio dire, diciamo che ci sono 10 tabelle e voglio leggere i valori dal 6 o ho l'id della tabella.

Oppure diciamo che voglio leggere il valore di td dopo alcuni td.

Oppure una tabella che viene dopo un determinato div o elemento o testo. Sono questi possibili?

Risposta accettata

Tutto ciò che hai chiesto potrebbe essere fatto relativamente facilmente. Non importa che la sua documentazione possa mancare, dovrebbe essere simile a XML e all'implementazione XmlDocument della rete sia nell'uso che nella funzionalità.

Come posso leggere i valori all'interno di determinate tabelle? Diciamo che ci sono 10 tabelle e voglio leggere i valori dal sesto o ho l'id della tabella.

Trovare la sesta tabella:

// XPath
var table6 = doc.DocumentNode.SelectSingleNode("//table[6]");

// LINQ
var table6 = doc.DocumentNode.Descendants("table").Skip(5).FirstOrDefault();

Trovare la tabella / elemento per id:

var myTable = doc.GetElementById("myTable");

// XPath
var myTable = doc.DocumentNode.SelectSingleNode("//table[@id='myTable']");
var myTable = doc.DocumentNode.SelectSingleNode("//*[@id='myTable']");

// LINQ
var myTable = doc.DocumentNode
    .Descendants("table")
    .Where(table => table.Attributes.Contains("id"))
    .SingleOrDefault(table => table.Attributes["id"].Value == "myTable");
var myTable = doc.DocumentNode
    .Descendants()
    .Where(e => e.Attributes.Contains("id"))
    .SingleOrDefault(e => e.Attributes["id"].Value == "myTable");
var myTable = doc.DocumentNode
    .Descendants("table")
    .SingleOrDefault(table => table.GetAttributeValue("id", null) == "myTable");
var myTable = doc.DocumentNode
    .Descendants()
    .SingleOrDefault(e => e.GetAttributeValue("id", null) == "myTable");

Diciamo che voglio leggere il valore di td in arrivo dopo alcuni td.

// XPath
var certainTd = table6.SelectSingleNode("//td[2]");
var tdAfterCertainTd = certainTd.SelectSingleNode("following-sibling::td[1]");

// LINQ (not so easy)
var certainTd = table6.Descendants("td").Skip(1).FirstOrDefault();
var tdAfterCertainTd = certainTd.NextSibling;
while (tdAfterCertainTd != null)
{
    if (tdAfterCertainTd.Name == "td")
        break;
    tdAfterCertainTd = tdAfterCertainTd.NextSibling;
}

Tabella che viene dopo un determinato div o elemento o testo.

// XPath
var certainDiv = doc.DocumentNode.SelectSingleNode("//div[1]");
var tableAfterCertainDiv = certainDiv.SelectSingleNode("following-sibling::table[1]");

// LINQ (not so easy)
var certainDiv = doc.DocumentNode.Descendants("div").FirstOrDefault();
var tableAfterCertainDiv = certainDiv.NextSibling;
while (tableAfterCertainDiv != null)
{
    if (tableAfterCertainDiv.Name == "table")
        break;
    tableAfterCertainDiv = tableAfterCertainDiv.NextSibling;
}

Dovresti notare alcuni modelli.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché