使用xPath和C#从网页中提取计时器值

时间:2014-06-07 22:40:02

标签: c# xpath html-agility-pack

我正在尝试使用HtmlAgilityPack中的xpath从网站中提取一些计时器值。但是,当我使用xpath时,我得到空引用异常,因为当我抓取它时,某个特定节点不存在。为了测试这是为什么,我使用doc.Save自己检查节点,我发现节点确实不存在。根据我的理解,HtmlAgilityPack应该几乎完全按照我的方式下载网页,其中包含所有数据。但是,大多数数据实际上都缺失了。

我应该如何从以下任一网站获取计时器值,甚至是事件标题:

http://dulfy.net/2014/04/23/event-timer/

http://guildwarstemple.com/dragontimer/eventsb.php?serverKey=108&langKey=1

我目前从guildwarstemple第一个时间框中提取事件标题的代码是:

public void updateEventData()
{
    //string Url = "http://dulfy.net/2014/04/23/event-timer/";
    string Url = "http://guildwarstemple.com/dragontimer/eventsb.php?serverKey=108&langKey=1";
    HtmlWeb web = new HtmlWeb();
    HtmlDocument doc = web.Load(Url);

    doc.Save("c:/doc.html");
    Title = doc.DocumentNode.SelectNodes("//*[@id='ep1']/p")[0].InnerText;
    //*[@id="scheduleList"]/div[3]
    //*[@id="scheduleList"]/div[3]/div[3]/text()
}

1 个答案:

答案 0 :(得分:0)

您的XPath表达式失败,因为文档中只有一个 div @id='ep1',并且 p内:

<div id="ep1" class="eventTimeBox"></div>

事实上,所有 div中的megaContainer在您尝试使用代码加载的链接中为空。

如果你认为那里应该有p个元素,它可能是通过JavaScript动态添加的,所以当你用C#客户端抓取网站时它可能不可用。

事实上,有一些JavaScript变量:

<script>
...
var e7 = 'ep1';
...
var e7t = '57600';
...

也许你想获得这些数据。这样:

substring-before(substring-after(normalize-space(//script[contains(.,"var e7t")]),"var e7t = '"),"'")

选择包含<script>的{​​{1}}并提取撇号中的字符串。它将返回:

var e7t

与您的其他链接相同。表达式:

57600

是一个空的//*[@id="scheduleList"] 。你无法在其中进一步导航:

div

但是这次似乎没有嵌套的JavaScript在页面中引用它。