HtmlAgilityPack - 특정 테이블에서 링크 추출

.net c# html-agility-pack

문제

사이트에서 링크를 파싱하는 정확한 방법을 찾는 데 어려움을 겪고 있습니다. 파이어 버그를 사용 하면 테이블의 정확한 xPath는 다음과 같습니다.

/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'(정확하게 도움이되지는 않음)이 있습니다.

내가하고 싶은 것은 처음에 모든 링크를 찾아서 목록에 추가하는 것뿐입니다.

여기 내 현재 코드 스 니펫 ( 이 게시물의 도움을 받아서 :

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

그 특정 테이블을 찾을 수 없기 때문에 HtmlNodeCollection 행에서 바로 Null 예외 오류가 계속 발생합니다. 테이블 ID를 통해 검색을 시도했지만 어느 쪽도 도움이되지 않았습니다.

이 테이블에 올라 가면 도움이 될 것입니다.

수락 된 답변

Scott Mitchell에서 사용한 예제를 사용 하여 모든 링크를 최종적으로 추출 할 수있었습니다. 그의 예는 다음과 같습니다.

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

jessehouwing 및 casperOne에게 신속하게 응답 해 주셔서 감사합니다!




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