【问题标题】:Looping through node created by HtmlAgilityPack循环通过 HtmlAgilityPack 创建的节点
【发布时间】:2012-08-08 15:10:56
【问题描述】:

我需要使用 HtmlAgilityPack 和 C# 解析这个 html 代码。我可以得到 div class="patent_bibdata" 节点,但我不知道如何循环通过子节点。

在这个示例中有 6 个 href,但我需要将它们分成两组;发明家,分类。我对最后两个不感兴趣。此 div 中可以有任意数量的 href。

如您所见,在两组之前有一段文字说明了 href 是什么。

代码sn-p

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

// 安德斯

PS!我知道在这个页面中,发明者的名字是一样的,但他们中的大多数是不同的!

【问题讨论】:

    标签: c#-4.0 xpath html-agility-pack


    【解决方案1】:

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

    【讨论】:

    • 不错!但是如何获取分类组中的href?
    【解决方案2】:

    所以很明显我(还)不了解 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);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      相关资源
      最近更新 更多