【问题标题】:Error while using XPath to parse text from HTML使用 XPath 解析 HTML 中的文本时出错
【发布时间】:2013-07-05 15:22:20
【问题描述】:

我需要解析的 HTML 内容是 marquee 元素中的文本,如下所示。我正在使用带有 HTML Agility Pack 的 C# 来解析它,但是会抛出 nullrefrence 异常。

C#代码是

var ht1 = ht.DocumentNode.SelectSingleNode("html/body/table/tbody/tr/td[2]/div[2]/marquee/text()").InnerText; 

部分 HTML:

<html>
   -<body ...
      -<table id=..
         -<tbody>
           -<tr>
             +<td.........
             -<td
               +<div ......
               -<div style="width:100%;padding:0;margin:0;border
                -style:solid;border-width:0;border-color:darkred;">
                  <marquee width="100%" height="20" bgcolor="" style="color:
                  darkorchid; font-size: 14" loop="3" behavior="scroll" 
                  scrolldelay="90 scrollamount="5" align="middle" border="0">
                   your scrolling text - these are some samples - think  of
                   possibilities</marquee>
                  <div>

【问题讨论】:

    标签: c# html xpath


    【解决方案1】:
    1. 您是否查看了 html 文件的直接来源?如果您只查看在 Firebug/fox 等浏览器中显示的 html,它会显示额外的 tbody 标记,这些标记实际上并不在文件中。
      因此使用:

      var ht1 = ht.DocumentNode.SelectSingleNode("html/body/table/tr/td[2]/div[2]/marquee/text()").InnerText; 
      
    2. 您通常不想使用 text(),因为节点的文本内容已经是它的文本。并且 text() 返回一组文本节点,而不是连接的文本。
      因此使用:

      var ht1 = ht.DocumentNode.SelectSingleNode("html/body/table/tr/td[2]/div[2]/marquee").InnerText
      

    【讨论】:

    • var ht1 = ht.DocumentNode.SelectSingleNode("html/body/table/tr/td[2]/div[2]/marquee").InnerText 从来没有工作所以我添加了 text(),这也没有帮助。
    • 好的,页面源已完全损坏。最好只使用(//marquee)[1] 来获得第一个选框
    【解决方案2】:

    该页面似乎不是格式良好的 HTML。 不过这对我有用:

    ht.DocumentNode.SelectSingleNode(@"html/head/table[1]/tbody/tr/td[1]/td/div[2]/marquee").InnerText;
    

    【讨论】:

      猜你喜欢
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多