Ich verwende HtmlAgility-Paket zum Parsen der HTML-Seite. Ich bin in der Lage, meinen Abschnitt zu finden, von wo ich Daten erhalten muss. Wirklich ist es ein Tisch, und ich muss seinen tr analysieren. Grundsätzlich habe ich zwei Abfragen.
Wenn ich eine Seite in den Parser geladen habe, dauerte es etwa 20-30 Sekunden, um sie in den Speicher zu laden, und es gibt ungefähr 4738 Webseiten zum Parsen. Also, ich möchte es reduzieren .... Ich möchte wissen, Kann ich delegieren Anruf die Methode in einer Schleife, so dass ich die Zeit der Verzögerung reduzieren kann. Oder gibt es einen effizienten Weg dazu? Bitte führe mich durch das.
Ich bekomme meine Zeile als "\r\n\t\t\t\t<td style=\"width:20%;\">110001</td><td style=\"width:25%;\">New Delhi</td><td style=\"width:25%;\">Delhi</td><td style=\"width:30%;\">Baroda House</td>\r\n\t\t\t"
, von der oben habe ich 11001, Neu - Delhi, Delhi und Baroda Haus zu analysieren. Eigentlich habe ich eine Klasse Pincodes wo ich die Eigenschaften Pincode, Area, State und District habe. Also brauche ich eine Regex oder irgendeine Art, diese Werte in die Klasse zu bringen.
Schließlich muss ich diese Datensätze in meine Datenbank schieben, wo ich Linq2Sql verwende. Also bitte alle Dinge sagen, gib mir eine Lösung. Jede Verweisung oder Verbindung ist eine große Hilfe.
Mein Code:
var url = @"http://www.eximguru.com/traderesources/pincode.aspx?&GridInfo=Pincode01";
var web = new HtmlWeb();
var doc = web.Load(url);
//doc.DocumentNode.SelectSingleNode("//*[@id=\"lst-ib\"]");//("/html/body/div[2]/form/div/div[2]/table/tbody/tr/td/table/tbody/tr/td/div/table/tbody/tr/td/table/tbody/tr/td[2]/div/input");
//System.Console.WriteLine(doc.DocumentNode.SelectSingleNode("//*[@id=\"lst-ib\"]").Id);
var htmlNode =
doc.DocumentNode.SelectSingleNode(
"//*[@id=\"ctl00_uxContentPlaceHolder_ResourceAndGuideUserControl1_ResourceAndGuideGrid_myGridView_mainGridView\"]");
Danke im Voraus
Es sieht nicht so aus, als gäbe es ein Muster für die URLs, IDs oder irgendetwas anderes auf dieser Seite. Es war schlecht gestaltet. Wenn es ein schönes Muster dazu gab (wie die verschiedenen Seitenzahlen für die Ergebnisse), dann könnte dies vielleicht parallel gemacht werden. Da dies nicht der Fall ist, müssten Sie es sequentiell tun, da es keine zuverlässige Methode gibt (die ich sehen kann), um die URL auf die nächste Seite zu bringen.
var url = "http://eximguru.com/traderesources/pincode.aspx?&GridInfo=Pincode01";
var web = new HtmlWeb();
var results = new List<Pincode>();
while (!String.IsNullOrWhiteSpace(url))
{
var doc = web.Load(url);
var query = doc.DocumentNode
.SelectNodes("//div[@class='Search']/div[3]//tr")
.Skip(1)
.Select(row => row.SelectNodes("td"))
.Select(row => new Pincode
{
PinCode = row[0].InnerText,
District = row[1].InnerText,
State = row[2].InnerText,
Area = row[3].InnerText,
});
results.AddRange(query);
var next = doc.DocumentNode
.SelectSingleNode("//div[@class='slistFooter']//a[last()]");
if (next != null && next.InnerText == "Next")
{
url = next.Attributes["href"].Value;
}
else
{
url = null;
}
}