HtmlAgilityPack - Extrahiert Links aus einer bestimmten Tabelle

.net c# html-agility-pack

Frage

Ich habe Probleme, die genaue Art zu finden, Links von einer Site zu analysieren. Wenn Sie Firebug verwenden, lautet der exakte xPath der Tabelle wie folgt:

/html/body/div/form/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[1]/td/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr[1]/td/div/table/tbody/tr[3]/td/div/table/tbody/tr/td/div/table

Es hat auch eine ID = 'ctl00_cp1_GridView1' (was nicht gerade hilfreich war).

Ich möchte nur alle Links in der ersten finden und sie zu einer Liste hinzufügen.

Hier ist mein aktuelles Code-Snippet (mit etwas Hilfe von diesem Post :

protected void btnSubmitURL_Click(object sender, EventArgs e)
{
    try
    {
        List<string> siteList = new List<string>();
        int counter = 1;

        var web = new HtmlWeb();
        var doc = web.Load(txtURL.Text);
        var table = doc.DocumentNode.SelectSingleNode("html/body/div/form/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[1]/td/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr[1]/td/div/table/tbody/tr[3]/td/div/table/tbody/tr/td/div/table[@id='ctl00_cp1_GridView1']/tbody");
        HtmlNodeCollection rows = table.SelectNodes("./tr");
        if (rows != null)
        {
            for (int i = 0; i < rows.Count; i++)
            {
                HtmlNodeCollection cols = rows[i].SelectNodes("./td[1]");
                if (cols != null)
                {
                    for (int j = 0; j < cols.Count; j++)
                    {
                        HtmlNode aTags = cols[i].SelectSingleNode("./a[@id='NormalColoredFont']");
                        if (aTags != null)
                        {
                            siteList.Add(counter + ". " + aTags.InnerHtml + " - " + aTags.Attributes["href"].Value);
                        }
                    }
                }
            }
        }

        lblOutput.Text = siteList.Count.ToString();
    }

    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

Ich bekomme immer einen Null Exception-Fehler direkt in den HtmlNodeCollection-Zeilen, weil er diese bestimmte Tabelle nicht finden kann. Ich habe versucht, über die Tabellen-ID zu suchen, aber das hat auch nicht geholfen.

Jede Hilfe mit dem Erreichen dieses Tisches wäre willkommen.

Akzeptierte Antwort

Ich konnte schließlich alle Links anhand des von Scott Mitchell verwendeten Beispiels extrahieren. Sein Beispiel ist wie folgt:

var linksOnPage = from lnks in document.DocumentNode.Descendants()
              where lnks.Name == "a" && 
                   lnks.Attributes["href"] != null && 
                   lnks.InnerText.Trim().Length > 0
              select new
              {
                 Url = lnks.Attributes["href"].Value,
                 Text = lnks.InnerText
              };

Danke an jessehouwing und casperOne für schnelle Reaktion!



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum