从Web脚本解析 - 更改源代码内容?

时间:2011-04-15 05:09:18

标签: c# html-parsing html-agility-pack

我一直试图解析php生成的网页(不是网站)。我尝试在C#和PHP中使用xpath通过HTMLAgility进行解析。起初我认为由于值不正确,我没有正确解析。

后来,我发现实际上我正在解析它。但是该页面中有一个脚本正在加载时更改值。怎么,我不知道。

我是解析的新手,所以这就是根据我发生的事情:

  1. 我正在下载内容的源代码。我要解析的部分有点像这样:

    <b id="solved_b">0</b>
    
  2. 加载页面时,源代码中的脚本会将值更改为0以外的值。

  3. 当我使用xpath进行解析时,会解析原始值,即0,而不是脚本更改的值。

  4. 那么,我如何解析更改后的值而不是原始值?

    我要解析的页面是 http://felix-halim.net/uva/hunting.php?id=59756

    这是HTMLAgility中的代码段:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using HtmlAgilityPack;
    namespace ParseFelix {
        class WebParser {
            string webUrl;
    
            public WebParser(string url) {
    
                webUrl = "http://felix-halim.net/uva/hunting.php?id=59756";
    
                HtmlWeb htmlWeb = new HtmlWeb();
                HtmlDocument htmldoc = htmlWeb.Load(webUrl);
    
                var username = htmldoc.DocumentNode.SelectSingleNode("/html/body/div/h2/i");
                var submittedStats = htmldoc.DocumentNode.SelectSingleNode(".//*[@id=\"submissions_b\"]");
                string content = htmldoc.DocumentNode.InnerHtml;
                //System.IO.File.WriteAllText("D:\\exp\\felix\\parsed.txt", content);
                var acceptedStats = htmldoc.DocumentNode.SelectSingleNode(".//*[@id=\"solved_b\"]");
                Console.WriteLine("Username is {0}, you submitted {1} solutions, and {2} were accepted", username.InnerText, submittedStats.InnerText, acceptedStats.InnerText);
    
              }
        }
    }
    

2 个答案:

答案 0 :(得分:0)

使用Fiddler - 您将看到该网站进行了ajax查询,而某些值来自json:

POST http://felix-halim.net/uva/service2.php HTTP/1.1
Host: felix-halim.net
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0
Accept: */*
Accept-Language: lt
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Proxy-Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://felix-halim.net/uva/hunting.php?id=59756
Content-Length: 73
Cookie: PHPSESSID=o6if4t4vqadv7ia6vbqcfcvi75
Pragma: no-cache
Cache-Control: no-cache

{"method":"uva2.chat_update","params":[12150,59756,"guest",3127,8744317]}

并回复:

HTTP/1.0 200 OK
Date: Fri, 15 Apr 2011 05:32:08 GMT
Server: Apache
X-Powered-By: PHP/5.2.15
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html
Content-Length: 2069

[null,[["0","guest","1302842169"],["0","guest","1302793161"]<SKIPPED>

答案 1 :(得分:0)

你要做的是解析javascript吧? 这是AFAIK不可能的(除了编写自己的解析器或使用现有的解析器)。 你想要的是阅读被操纵的DOM,这根本不是微不足道的