버그 해결을 위한 모든 질문을 던져
0 votes
186 views
아래와 같은 페이지에서 c# 샘플프로젝트를 이용해

크롤링을 시도 하고 있습니다

https://navercomp.wisereport.co.kr/v2/company/c1050001.aspx?cmp_cd=020560&cn=

 

헌데 xPath 값을 읽어보려고 하니

HAPXPathFinder  로 할때는 id가 포함된 값이 아닌데

크롬에서 F12로 눌러서 접근해서 얻어오는 xPath 값은

뭔가 id를 갖고 있더라구요(아래와 같이)

//*[@id="pArea"]/div[1]/div/table/tbody/tr[1]

그래서 아래와 같은 기존 크롤링 로직으로

 

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            using (var webClient = new WebClient()) {
                webClient.Headers.Add(HttpRequestHeader.UserAgent,
                    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");                
                doc.Load(webClient.OpenRead(targetPage));

                /*
                Dictionary<string, string> stockInfoDic = new Dictionary<string, string>();
                stockInfoDic.Add("EPS", "/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tr[3]/td[1]/dl[1]/dt[1]");
                stockInfoDic.Add("BPS", "/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tr[3]/td[1]/dl[1]/dt[2]");
                stockInfoDic.Add("PER", "/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tr[3]/td[1]/dl[1]/dt[3]");
                stockInfoDic.Add("SPER", "/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tr[3]/td[1]/dl[1]/dt[4]");
                stockInfoDic.Add("PBR", "/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tr[3]/td[1]/dl[1]/dt[5]");
                stockInfoDic.Add("BDS", "/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tr[3]/td[1]/dl[1]/dt[6]");

                foreach (string key in stockInfoDic.Keys) {
                    HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes(stockInfoDic[key]);
                    if(nodes.Count >= 1) {
                        txtResult.Text += nodes[0].OuterHtml;
                    }
                    //HtmlNode node = doc.DocumentNode.SelectSingleNode(stockInfoDic[key]);
                    //txtResult.Text += node.OuterHtml;
                }
                */
                
                string xPath = "//*[@id="pArea"]/div[1]/div/table/tbody/tr[1]";
                HtmlNode node = doc.DocumentNode.SelectSingleNode(xPath);
                
                    txtResult.Text = node.OuterHtml;
                
                
            }     

 

하니 null 만 넘어오네요

해당 페이지의 값들은 id가 포함되지 않았을땐 쉽게 얻어올수있었는데

id가 포함된 xPath를 통해서는 null 값만 오더라구요

 

이게 페이지에서 얻어올수 없게 해둔것인가요?

제 접근법이 잘못된 것인가요?

크롤링 초보입니다  어떤 힌트될 답변이라도 주시면 정말 감사하겠습니다 ㅜ_ㅜ
asked (5 point) , 186 views

1 답변

0 votes
우수 답변
//*[@id='pArea']/div[1]/div/table

까지는 잘찾아집니다

크롬이 tbody로 xpath를 생성하는데 이부분은 HtmlAgilityPack 이 인식을 못하는군요

하위에서 한땀 한땀 조정해주시면됩니다

xPath = "//*[@id='pArea']/div[1]/div/table/tr[1]";
answered (329 point)
선택됨
말씀하신대로 chrome에서 얻어지는 xPath 값에

tBody만 삭제하니 매우 잘 작동합니다

덕분에 해결되었습니다 정말 감사합니다 b

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

170 질문
273 answers
292 댓글
285 users