特定のhtml内のすべてのタグ間でテキストを取得し、リンクを再帰的に経由する

c# html html-agility-pack web-crawler

質問

私はすべてのhtmlタグの間にすべての単語を取得することに関するスタックオーバーフローの投稿のカップルをチェックした!彼らのすべてが私を混乱させた!いくつかの人々は、単一のタグのために特別な表現を推奨していますが、構文解析技術については言及しています。基本的にWebクローラを作成しようとしています!そのために、私はリンクのHTMLを文字列で私のプログラムにフェッチしました!私はまた、私は自分のデータ文字列に格納されているHTMLからのリンクを抽出しました!今私は奥行きを巡り、文字列から抽出したすべてのリンクのページで単語を抽出したい!私は2つの質問を得た!どのように私はタグとJavaスクリプトを無視して、Webページのそれぞれの単語を取得できますか?第二に、どのように再帰的にリンクをクロールするのですか?

これはどのように文字列のHTMLを取得しています:

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);
        }
    }

これはどのように私は与えるURLからリンクのrefrencesを抽出しています:

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);
        }
    }

人気のある回答

正規表現はHTMLファイルの解析には適していません。

HTMLは厳密でもなく、形式も規則的ではありません。

htmlagilitypackを使用する


これは、Webページからすべてのリンクを抽出します。

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>();
}

これはhtmlのタグを除くすべてのコンテンツを取得します

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>();
}

これはすべてのリンクを介してクロールします

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>();
}



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ