Парсинг из веб - скрипта изменяет содержимое исходного кода? - PullRequest
0 голосов
/ 15 апреля 2011

Я пытался проанализировать сгенерированную php веб-страницу (не сайт) в течение некоторого времени.Я попытался разобрать, используя xpath через HTMLAgility в C #, а также PHP.Сначала я подумал, что неправильно анализирую из-за неверных значений.

Позже я обнаружил, что на самом деле я его правильно анализирую.Но на этой странице есть скрипт, который меняет значение при загрузке.как, я не знаю.

Я новичок в разборе, поэтому вот что происходит со мной:

  1. Я загружаю исходный код контента,Часть, которую я хочу проанализировать, выглядит примерно так:

    <b id="solved_b">0</b>
    
  2. При загрузке страницы скрипт в исходном коде изменяет значение на значение, отличное от 0.

  3. Когда я анализирую с использованием xpath, вместо измененного значения скрипта анализируется исходное значение, то есть 0.

Итак, как мне проанализировать измененноезначение вместо исходного?

страница, которую я пытаюсь проанализировать: 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 голосов
/ 15 апреля 2011

Ну, что вы пытаетесь сделать, это правильно разбирать javascript? И это AFAIK невозможно (кроме написания вашего собственного парсера или использования существующего). То, что вы хотите, это прочитать DOM, которым манипулируют, и это совсем не тривиально

0 голосов
/ 15 апреля 2011

Используйте 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>
...