HtmlAgilityPack에서 만든 노드를 통한 루핑

c#-4.0 html-agility-pack xpath

문제

HtmlAgilityPack 및 C #을 사용하여이 html 코드를 파싱해야합니다. div 클래스 = "patent_bibdata"노드를 얻을 수 있지만 자식 노드를 통해 반복하는 방법을 알지 못합니다.

이 샘플에는 6 개의 href가 있지만 두 개의 그룹으로 구분해야합니다. 발명가, 분류. 나는 지난 두 사람에 관심이 없다. 이 div에는 여러 개의 href가있을 수 있습니다.

당신이 볼 수 있듯이, 두 그룹 앞에는 텍스트가있어 그 들판이 무엇인지 말하고 있습니다.

코드 스 니펫

HtmlWeb hw = new HtmlWeb();
HtmlDocument doc = m_hw.Load("http://www.google.com/patents/US3748943");
string xpath = "/html/body/table[@id='viewport_table']/tr/td[@id='viewport_td']/div[@class='vertical_module_list_row'][1]/div[@id='overview']/div[@id='overview_v']/table[@id='summarytable']/tr/td/div[@class='patent_bibdata']";
HtmlNode node = m_doc.DocumentNode.SelectSingleNode(xpath);

그러면 어떻게 할 수 있니?

<div class="patent_bibdata">
    <b>Inventors</b>:&nbsp;
    <a href="http://www.google.com/search?tbo=p&amp;tbm=pts&amp;hl=en&amp;q=ininventor:%22Ronald+T.+Lashley%22">
    Ronald T. Lashley
    </a>, 
    <a href="http://www.google.com/search?tbo=p&amp;tbm=pts&amp;hl=en&amp;q=ininventor:%22Ronald+T.+Lashley%22">
    Ronald T. Lashley
    </a><br>
    <b>Current U.S. Classification</b>:&nbsp;
    <a href="http://www.google.com/url?id=3eF8AAAAEBAJ&amp;q=http://www.uspto.gov/web/patents/classification/uspc084/defs084.htm&amp;usg=AFQjCNEZRFtAyKTfNudgc-XVt2-VboD77Q#C084S31200P">84/312.00P</a>;
    <a href="http://www.google.com/url?id=3eF8AAAAEBAJ&amp;q=http://www.uspto.gov/web/patents/classification/uspc084/defs084.htm&amp;usg=AFQjCNEZRFtAyKTfNudgc-XVt2-VboD77Q#C084S31200R">84/312.00R</a><br>
    <br>
    <a href="http://www.google.com/url?id=3eF8AAAAEBAJ&q=http://patft.uspto.gov/netacgi/nph-Parser%3FSect2%3DPTO1%26Sect2%3DHITOFF%26p%3D1%26u%3D/netahtml/PTO/search-bool.html%26r%3D1%26f%3DG%26l%3D50%26d%3DPALL%26RefSrch%3Dyes%26Query%3DPN/3748943&usg=AFQjCNGKUic_9BaMHWdCZtCghtG5SYog-A">
    View patent at USPTO</a><br>
    <a href="http://www.google.com/url?id=3eF8AAAAEBAJ&q=http://assignments.uspto.gov/assignments/q%3Fdb%3Dpat%26pat%3D3748943&usg=AFQjCNGbD7fvsJjOib3GgdU1gCXKiVjQsw">
    Search USPTO Assignment Database
    </a><br>
</div>

원했던 결과 InventorGroup =

<a href="http://www.google.com/search?tbo=p&amp;tbm=pts&amp;hl=en&amp;q=ininventor:%22Ronald+T.+Lashley%22">
    Ronald T. Lashley
    </a>
    <a href="http://www.google.com/search?tbo=p&amp;tbm=pts&amp;hl=en&amp;q=ininventor:%22Ronald+T.+Lashley%22">
    Thomas R. Lashley
    </a>

분류 그룹

<a href="http://www.google.com/url?id=3eF8AAAAEBAJ&amp;q=http://www.uspto.gov/web/patents/classification/uspc084/defs084.htm&amp;usg=AFQjCNEZRFtAyKTfNudgc-XVt2-VboD77Q#C084S31200P">84/312.00P</a>;
    <a href="http://www.google.com/url?id=3eF8AAAAEBAJ&amp;q=http://www.uspto.gov/web/patents/classification/uspc084/defs084.htm&amp;usg=AFQjCNEZRFtAyKTfNudgc-XVt2-VboD77Q#C084S31200R">84/312.00R</a>

스크래핑하려는 페이지 : http://www.google.com/patents/US3748943

// Anders

추신! 나는이 페이지에서 발명가의 이름이 동일하다는 것을 알고 있지만, 대부분이 다르다!

수락 된 답변

XPATH는 당신의 친구입니다! 이 같은 것이 당신에게 발명가 이름을 줄 것입니다 :

HtmlWeb w = new HtmlWeb();
HtmlDocument doc = w.Load("http://www.google.com/patents/US3748943");
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='patent_bibdata']/br[1]/preceding-sibling::a"))
{
    Console.WriteLine(node.InnerHtml);
}

인기 답변

그래서 XPath (아직)를 이해하지 못한다는 것은 명백합니다. 그래서 나는이 해결책을 생각해 냈습니다. 어쩌면 똑똑한 해결책이 아닐지 모르지만 작동합니다!

// Anders

List<string> inventorList = new List<string>();
List<string> classificationList = new List<string>();

string xpath = "/html/body/table[@id='viewport_table']/tr/td[@id='viewport_td']/div[@class='vertical_module_list_row'][1]/div[@id='overview']/div[@id='overview_v']/table[@id='summarytable']/tr/td/div[@class='patent_bibdata']";
HtmlNode nodes = m_doc.DocumentNode.SelectSingleNode(xpath);
bool bInventors = false;
bool bClassification = false;
for (int i = 0; i < nodes.ChildNodes.Count; i++)
{
    HtmlNode node = nodes.ChildNodes[i];
    string txt = node.InnerText;
    if (txt.IndexOf("Inventor") > -1)
    {
        bClassification = false;
        bInventors = true;
    }
    if (txt.IndexOf("Classification") > -1)
    {
        bClassification = true;
        bInventors = false;
    }
    if (txt.IndexOf("USPTO") > -1)
    {
        bClassification = false;
        bInventors = false;
    }
    string name = node.Name;
    if (name.IndexOf("a") > -1)
    {
        if (bInventors)
        {
            string inventor = node.InnerText;
            inventorList.Add(inventor);
        }
        if (bClassification)
        {
            string classification = node.InnerText;
            classificationList.Add(classification);
        }
    }


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