HtmlAgilityPack - HTML 테이블에서 데이터 가져 오기

c# html html-agility-pack screen-scraping

문제

내 프로그램은 HtmlAgilityPack을 사용하고 HTML 웹 페이지를 가져 와서 변수에 저장하고 특정 Div 클래스 태그 (boardcontainer) 아래에있는 HTML 두 테이블에서 가져 오려고합니다. 현재 코드에서는 모든 테이블에 대해 전체 웹 페이지를 검색하고 표시하지만 셀이 비어 있으면 예외가 throw됩니다.

"NullReferenceException 처리되지 않았습니다 - 개체 참조가 개체의 인스턴스로 설정되어 있지 않습니다."

HTML 스 니펫 (이 경우 웹 사이트에서 'Microsoft'를 검색하고 있습니다.

<div class="boardcontainer">
<table cellpadding="4" cellspacing="1" border="0" width="100%">
<tr><td colspan="6" class="catbg" height="18" >Main Database</td></tr>
<tr>
    <td class="windowbg" width="28%" align="center">Company Name</td>
    <td class="windowbg" width="12%" align="center">0870 / 0871</td>
    <td class="windowbg" width="12%" align="center">0844 / 0845</td>
    <td class="windowbg" width="12%" align="center">01 / 02 / 03</td>
    <td class="windowbg" width="12%" align="center">Freephone</td>
    <td class="windowbg" width="24%" align="center">Other Information</td>
</tr>
    <tr>
<td class=windowbg2 width=28% align=center BGCOLOR=#FFFFCC><a href=http://www.websitename.com/exit.php?site=www.microsoft.co.uk target="_blank">Microsoft</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0870 601 0100</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0844 800 2400</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�01954 713950</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�</a></td><td class=windowbg2 width=24% align=center BGCOLOR=#FFFFCC>�<b>Customer Support</b><br><i>Straight to agent (no menu)</i><br><font size=1>Also for 0870 6010200</font></td></tr>
    <tr>
<td class=windowbg2 width=28% align=center BGCOLOR=#FFFFCC><a href=http://www.websitename.com/exit.php?site=www.microsoft.co.uk target="_blank">Microsoft</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0870 601 0100</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0844 800 2400</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0118 909 7800</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�</a></td><td class=windowbg2 width=24% align=center BGCOLOR=#FFFFCC>�<b>Main UK Switchboard</b><br><i>Ask to be put through to required department</i><br><font size=1>Also for 0870 6010200</font></td></tr>
    <tr>

이 테이블을 잡아서 행을 표시하는 현재 코드 - 셀이 Null에 예외를 throw합니다.

<div class="boardcontainer">
<table cellpadding="4" cellspacing="1" border="0" width="100%">
<tr><td colspan="6" class="catbg" height="18" >Main Database</td></tr>
<tr>
    <td class="windowbg" width="28%" align="center">Company Name</td>
    <td class="windowbg" width="12%" align="center">0870 / 0871</td>
    <td class="windowbg" width="12%" align="center">0844 / 0845</td>
    <td class="windowbg" width="12%" align="center">01 / 02 / 03</td>
    <td class="windowbg" width="12%" align="center">Freephone</td>
    <td class="windowbg" width="24%" align="center">Other Information</td>
</tr>
    <tr>
<td class=windowbg2 width=28% align=center BGCOLOR=#FFFFCC><a href=http://www.websitename.com/exit.php?site=www.microsoft.co.uk target="_blank">Microsoft</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0870 601 0100</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0844 800 2400</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�01954 713950</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�</a></td><td class=windowbg2 width=24% align=center BGCOLOR=#FFFFCC>�<b>Customer Support</b><br><i>Straight to agent (no menu)</i><br><font size=1>Also for 0870 6010200</font></td></tr>
    <tr>
<td class=windowbg2 width=28% align=center BGCOLOR=#FFFFCC><a href=http://www.websitename.com/exit.php?site=www.microsoft.co.uk target="_blank">Microsoft</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0870 601 0100</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0844 800 2400</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0118 909 7800</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�</a></td><td class=windowbg2 width=24% align=center BGCOLOR=#FFFFCC>�<b>Main UK Switchboard</b><br><i>Ask to be put through to required department</i><br><font size=1>Also for 0870 6010200</font></td></tr>
    <tr>

어떻게하면 특정 div 클래스를 검색하고 내부에서 표를 추출하도록 변경할 수 있습니까?

읽어 주셔서 감사합니다.

전체 HTML :

<div class="boardcontainer">
<table cellpadding="4" cellspacing="1" border="0" width="100%">
<tr><td colspan="6" class="catbg" height="18" >Main Database</td></tr>
<tr>
    <td class="windowbg" width="28%" align="center">Company Name</td>
    <td class="windowbg" width="12%" align="center">0870 / 0871</td>
    <td class="windowbg" width="12%" align="center">0844 / 0845</td>
    <td class="windowbg" width="12%" align="center">01 / 02 / 03</td>
    <td class="windowbg" width="12%" align="center">Freephone</td>
    <td class="windowbg" width="24%" align="center">Other Information</td>
</tr>
    <tr>
<td class=windowbg2 width=28% align=center BGCOLOR=#FFFFCC><a href=http://www.websitename.com/exit.php?site=www.microsoft.co.uk target="_blank">Microsoft</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0870 601 0100</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0844 800 2400</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�01954 713950</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�</a></td><td class=windowbg2 width=24% align=center BGCOLOR=#FFFFCC>�<b>Customer Support</b><br><i>Straight to agent (no menu)</i><br><font size=1>Also for 0870 6010200</font></td></tr>
    <tr>
<td class=windowbg2 width=28% align=center BGCOLOR=#FFFFCC><a href=http://www.websitename.com/exit.php?site=www.microsoft.co.uk target="_blank">Microsoft</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0870 601 0100</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0844 800 2400</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0118 909 7800</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�</a></td><td class=windowbg2 width=24% align=center BGCOLOR=#FFFFCC>�<b>Main UK Switchboard</b><br><i>Ask to be put through to required department</i><br><font size=1>Also for 0870 6010200</font></td></tr>
    <tr>

수락 된 답변

다음 XPATH에서는 HTML 문서 내에서 특정 DIV ( 'boardcontainer'클래스 사용)를 검색 할 수 있습니다.

//div[@class='boardcontainer']/table

빈 행을 처리하려면 반환 된 HtmlNodeCollectionnull 인지 여부를 확인하기 만하면됩니다.

다음은 완전한 예입니다.

//div[@class='boardcontainer']/table

또한 테이블이 있는지 그리고 발견 된 테이블에 행이 있는지를 확인해야합니다.


인기 답변

시험:

foreach (HtmlNode table in 
         htmlDoc.DocumentNode.SelectNodes("//div[@class='boardcontainer']/table"))

속성과 일치하는 XPath 표현식입니다. 자세한 정보는 여기를 참조하십시오.

http://www.exampledepot.com/egs/org.w3c.dom/xpath_getelembyattr.html




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