循環通過HtmlAgilityPack創建的節點

c#-4.0 html-agility-pack xpath

我需要使用HtmlAgilityPack和C#解析這個html代碼。我可以得到div class =“patent_bibdata”節點,但我不知道如何通過子節點循環。

在這個樣本中有6個href,但我需要將它們分成兩組;發明人,分類。我對最後兩個不感興趣。此div中可以有任意數量的href。

正如您所看到的,在兩組之前有一個文本說明了什麼是hrefs。

代碼段

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

那你怎麼做?

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

想要的結果InventorGroup =

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

ClassificationGroup

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

我試圖抓取的頁面: http//www.google.com/patents/US3748943

//安德斯

PS!我知道在這個頁面中發明者的名字是相同的,但在大多數情況下它們是不同的!

一般承認的答案

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。所以我提出了這個解決方案。也許不是最聰明的解決方案,但它確實有效!

//安德斯

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合法嗎? 是的,了解原因