HtmlAgilityPack을 사용하는 웹 스크래퍼

.net c# html-agility-pack visual-studio-2012 web-scraping

문제

나는 C #을 처음 사용하므로이 작업을 수행하는 방법이나 나에게 너무 복잡한 방법을 알 수 있지만 HtmlAgilityPack을 사용하여 웹 페이지를 설정하고 긁어 모으려고합니다. 현재 내 코드가 컴파일되지만 문자열을 쓸 때 나는 단지 1 개의 결과만을 얻고 ul에서 li의 마지막 결과가됩니다. 문자열 분할의 이유는 나중에 제목과 설명 문자열을 .csv로 나중에 사용하기 위해 출력 할 수 있기 때문입니다. 나는 그 다음에 무엇을 할 지 확신 할 수 없다. 왜 내가 도움 / 이해 / 생각 / 생각 / 제안을 할 수 있는지 묻고있다. 고맙습니다!

    private void button1_Click(object sender, EventArgs e)
    {
        List<string> cities = new List<string>();
        //var xpath = "//h2[span/@id='Cities']";
        var xpath = "//h2[span/@id='Cities']" + "/following-sibling::ul[1]" + "/li";

        WebClient web = new WebClient();
        String html = web.DownloadString("http://wikitravel.org/en/Vietnam");

        hap.HtmlDocument doc = new hap.HtmlDocument();
        doc.LoadHtml(html);


        foreach (hap.HtmlNode node in doc.DocumentNode.SelectNodes(xpath)) 
        {
            string all = node.InnerText;

            //splits text between '—', '-' or ' ' into 2 parts
            string[] split = all.Split(new char[] { '—', ' ', '-' }, StringSplitOptions.None);

            string title;
            string description;

            int nodeCount;
            nodeCount = node.ChildNodes.Count;

            if (nodeCount == 2)
            {
                title = node.ChildNodes[0].InnerText;
                description = node.ChildNodes[1].InnerText;
            }
            else if (nodeCount == 4)
            {
                title = node.ChildNodes[0].InnerText;
                description = node.ChildNodes[1].InnerText + node.ChildNodes[2].InnerText;
            }
            else
            {
                title = "Error";
                description = "The node cound was not 2 or 3.  Check the div section.";
            }

            System.IO.StreamWriter write = new System.IO.StreamWriter(@"C:\Users\cbrannin\Desktop\textTest\testText.txt");
            write.WriteLine(all);

            write.Close();


        }

    }
}

수락 된 답변

한 가지 문제는 매번 루프를 통해 출력 파일을 덮어 쓰는 것입니다. 아마 다음과 같이하고 싶을 것이다.

using (StreamWriter write = new StreamWriter(@"filename"))
{
    foreach (hap.HtmlNode node in doc.DocumentNode.SelectNodes(xpath))
    {
        // do your thing
        write.WriteLine(all);
    }
}

또한, SelectNode 호출에서 하나 이상의 HtmlNode 를 얻었는지 확인하기 위해 이것을 한 단계 밟았습니까?

마지막으로, 나는 당신이 title 이나 description 무엇을하고 있는지 알지 못한다. 그것들을 다른 것을 위해 사용할 계획 이었습니까?




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.