Ich habe ein paar Beiträge auf Stack-Überlauf überprüft, um alle Wörter zwischen allen HTML-Tags zu erhalten! Sie alle verwirrten mich! Einige Leute empfehlen regulären Ausdruck speziell für ein einzelnes Tag, während einige Parsing-Techniken erwähnt haben! Ich versuche grundsätzlich einen Web Crawler zu machen! dafür habe ich den html des link, den ich in einem string zu meinem programm geholt habe! Ich habe auch die Links aus dem HTML extrahiert, die ich in meiner Datenfolge gespeichert habe! Jetzt möchte ich durch die Tiefe kriechen und Wörter auf der Seite aller Links extrahieren, die ich aus meiner Zeichenfolge extrahiert habe! Ich habe zwei Fragen! Wie kann ich die Wörter auf den einzelnen Webseiten abrufen und Tags und Java-Script ignorieren? Zweitens, wie würde ich rekursiv durch die Links kriechen?
So erhalten Sie HTML in der Zeichenfolge:
public void getting_html_code_of_link()
{
string urlAddress = "http://google.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
Stream receiveStream = response.GetResponseStream();
StreamReader readStream = null;
if (response.CharacterSet == null)
readStream = new StreamReader(receiveStream);
else
readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
data = readStream.ReadToEnd();
response.Close();
readStream.Close();
Console.WriteLine(data);
}
}
und so extrahiere ich link refrences von der url gebe ich:
public void regex_ka_kaam()
{
StringBuilder sb = new StringBuilder();
//Regex hrefs = new Regex("<a href.*?>");
Regex http = new Regex("http://.*?>");
foreach (Match m in http.Matches(data))
{
sb.Append(m.ToString());
if (http.IsMatch(m.ToString()))
{
sb.Append(http.Match(m.ToString()));
sb.Append(" ");
//sb.Append("<br>");
}
else
{
sb.Append(m.ToString().Substring(1, m.ToString().Length - 1)); //+ "<br>");
}
}
Console.WriteLine(sb);
}
Regex ist keine gute Wahl für das Parsen von HTML-Dateien.
HTML ist nicht streng und es ist nicht regelmäßig mit seinem Format ..
Verwenden Sie htmlagilitypack
Dies extrahiert alle Links von der Webseite
public List<string> getAllLinks(string webAddress)
{
HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
HtmlDocument newdoc=web.Load(webAddress);
return doc.DocumentNode.SelectNodes("//a[@href]")
.Where(y=>y.Attributes["href"].Value.StartsWith("http"))
.Select(x=>x.Attributes["href"].Value)
.ToList<string>();
}
Dies ruft den gesamten Inhalt ohne Tags in HTML ab
public string getContent(string webAddress)
{
HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
HtmlDocument doc=web.Load(webAddress);
return string.Join(" ",doc.DocumentNode.Descendants().Select(x=>x.InnerText));
}
Das kriecht durch alle Links
public void crawl(string seedSite)
{
getContent(seedSite);//gets all the content
getAllLinks(seedSite);//get's all the links
}