2013-06-18 4 views
0

Борясь за 2 дня. Я использую C# и HtmlAgilityPack в проекте .NET 4.5 winforms для извлечения данных с веб-сайта (поле, которое я хочу извлечь, это $ flow и B/S ratio). Я попадаю в поле (поток:/n/t/t/t, вместо потока 245 М), но у меня нет значения. Я понятия не имею, почему я не получаю никакого значения, когда я запрашиваю, пока вижу значение на веб-странице. Хотелось бы узнать, найдет ли кто-то другой причину node = null результат моего запроса. Это URL-адрес athe queried web-страницы: http://finance.avafin.com/tradeFlow?type=BS_RATIO&date=06%2F14%2F2013&alertId=0&symbol=spy&sectorId=0&industryId=0HtmlAgilityPack запрос, возвращающий значение

Я использую указанный выше адрес в качестве запроса.

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

Используемый метод:

 /// <summary> 
     ///  Gets the data. 
     /// </summary> 
     /// <param name="url"> The URL. </param> 
     /// <returns> </returns> 
     public List<string> GetFlowData(string url) 
     { 
      // ('//a[contains(@href, "genre")]') 
      // <td class=" sorting_1">137.27B</td> 
      //*[@id="tf_data"]/tbody/tr[1]/td[8] // this is the xpath as seen in navigator for first value => I get no value when used as a query => (nodes = null) 
      //*[@id="tf_data"]/tbody/tr[1]/td[9] // this is the xpath as seen in navigator for second value => I get no value when used as a query => (nodes = null) 

// //td[@class=''] => nodes null too 


      // I see the b/s ratio node in body but no value /n/ttt instead using [@id='tf_data']/tbody 
      var nodes = LoadHtmlDoc(url, "//*[@id='tf_data']/tbody"); 
      List<string> tickers = new List<string>(); 
      if (nodes == null) 
      { 
       return new List<string> { "Ticker not available" }; 
      } 
      int i = 0; 
      foreach (var v in nodes) 
      { 
       i++; 

        MessageBox.Show(v.InnerText + " " + i.ToString()); 
       //// The placement of the data containing bought/sold ratio 
       //if (i == 7) 
       //{ 
       // tickers.Add(v.InnerText); 
       //} 
       //// The placement of the data containing $ Flow 
       //if (i == 8) 
       //{ 
       // tickers.Add(CleanFlowData(v.InnerText)); 
       //} 
      } 

      return tickers; 
     } 
+0

Я сделал loadhtml, и он отлично работает, он правильно загружает html-документ –

ответ

0

Страница вы запрашиваете не содержит каких-либо данных в таблице с идентификатором th_data. Если вы изучите страницу разметки, вы увидите:

<table cellpadding="0" cellspacing="0" border="0" class="display" id="tf_data"> 
    <thead> 
     <tr height="10"> 
      <th align="center"></th> 
      <th align="center" width="90">CHART</th> 
      <th align="left" width="70">SYMBOL</th> 
      <th align="left">MARKET CAP</th> 
      <th align="right" width="65">PRICE</th> 
      <th align="center" width="80">CHANGE</th> 
      <th align="right">VOL</th> 
      <th align="right">B/S RATIO</th> 
      <th align="right" width="80">NET CASH FLOW</th> 
     </tr> 
    </thead> 
    <tbody> <-- empty! 
    </tbody> 
</table> 

Все данные добавляются в эту таблицу в браузере с помощью Java Script после загрузки документа (см $(document).ready функцию). Поэтому, если вы получаете html из этого URL-адреса, данных не будет пока браузер не будет запускать код Java Script. То есть вы ничего не можете разобрать.

Я предлагаю вам изучить сценарий, который загружает данные JSON на страницу и просто вызывает ту же службу из вашего кода.


Его из сферы вопроса, но для извлечения данных, которые вы можете использовать HttpClient класс от System.Net.Http сборки. Ниже приведен пример использования (его до вас, чтобы проанализировать, каким образом должна быть составлена ​​строка запроса):

HttpClient client = new HttpClient(); 
client.BaseAddress = new Uri("http://finance.avafin.com"); 
string url = "data?sEcho=2&iColumns=9&sColumns=&iDisplayStart=0&iDisplayLength=20&mDataProp_0=0&mDataProp_1=1&mDataProp_2=2&mDataProp_3=3&mDataProp_4=4&mDataProp_5=5&mDataProp_6=6&mDataProp_7=7&mDataProp_8=8&sSearch=&bRegex=false&sSearch_0=&bRegex_0=false&bSearchable_0=true&sSearch_1=&bRegex_1=false&bSearchable_1=true&sSearch_2=&bRegex_2=false&bSearchable_2=true&sSearch_3=&bRegex_3=false&bSearchable_3=true&sSearch_4=&bRegex_4=false&bSearchable_4=true&sSearch_5=&bRegex_5=false&bSearchable_5=true&sSearch_6=&bRegex_6=false&bSearchable_6=true&sSearch_7=&bRegex_7=false&bSearchable_7=true&sSearch_8=&bRegex_8=false&bSearchable_8=true&iSortCol_0=4&sSortDir_0=asc&iSortingCols=1&bSortable_0=true&bSortable_1=true&bSortable_2=true&bSortable_3=true&bSortable_4=true&bSortable_5=true&bSortable_6=true&bSortable_7=true&bSortable_8=true&type=BS_RATIO&date=06%2F14%2F2013&categoryName=&alertId=0&alertId2=&industryId=0&sectorId=0&symbol=spy&recom=&period=&perfPercent="; 
var response = client.GetStringAsync(url).Result; 

Ответ будет содержать HTML, которые вы можете разобрать.

+0

Хорошо, любые предложения, как я могу позвонить службе json? Я вижу несколько строк js с '$ .getJSON'; JsonValue.Parse (webClient.DownloadString (url);? –

+0

@TeycirBenSoltane см. Обновление –

+0

спасибо lazyberezovsky –

Смежные вопросы