Извлечение значений и меток из таблицы веб-страниц, состоящей из элементов div, с помощью hmtlagilitypack - PullRequest
0 голосов
/ 30 марта 2020

Есть веб-страница, на которой я хочу извлечь метки и значения, которые есть в таблице, однако таблицу не удобно определять обычными тегами "tr" и "td" html, а вместо этого она использует " div class .. "Я не могу найти примеры кода для этого случая. Ниже приведен фрагмент кода HTML, который составляет таблицу, которую я ищу.

<div ng-controller="stockDetailSummary" ng-cloak>
    <div class="stockDetail" ng-show="quoteFound">
        <div ng-show="DataLoaded">

             <h2>Stock Scorecard</h2>
                <div class="Column Left">
            <div class="row">
                <div class="label">Market Cap</div>
                <div class="value" ng-if="quoteObj.currentMarketCap">{{quoteObj.currentMarketCap}}</div>
                <div class="value" ng-if="!quoteObj.currentMarketCap">- -</div>
            </div>
            <div class="row alt">
                <div class="label">Yield</div>
                <div class="value" ng-if="quoteObj.lastDividentReported">{{quoteObj.lastDividentReported | number:2 }}%<span ng-if="quoteObj.yield">%</span></div>
                <div class="value" ng-if="!quoteObj.lastDividentReported">- -</div>
            </div>  
            <div class="row">
                <div class="label">Quarterly Dividend</div>
                <div class="value" ng-if="quoteObj.dividend">{{quoteObj.dividend | number:2 }}</div>
                <div class="value" ng-if="!quoteObj.dividend">- -</div>
            </div>
            <div class="row alt">
                <div class="label">Open</div>
                <div class="value" ng-if="quoteObj.open">{{quoteObj.open | number:2 }}</div>
                <div class="value" ng-if="!quoteObj.open">- -</div>
            </div>
            <div class="row">
                <div class="label">High</div>
                <div class="value" ng-if="quoteObj.high">{{quoteObj.high | number:2 }}</div>
                <div class="value" ng-if="!quoteObj.high">- -</div>
            </div>  
            <div class="row alt">
                <div class="label">Low</div>
                <div class="value" ng-if="quoteObj.low">{{quoteObj.low | number:2 }}</div>
                <div class="value" ng-if="!quoteObj.low">- -</div>
            </div>
            <div class="row">
                <div class="label">Previous Close</div>
                <div class="value" ng-if="quoteObj.previousClosePrice">{{quoteObj.previousClosePrice | number:2}}</div>
                <div class="value" ng-if="!quoteObj.previousClosePrice">- -</div>
            </div>
            <div class="row alt">
                <div class="label">Volume</div>
                <div class="value" ng-if="quoteObj.totalVolume">{{quoteObj.totalVolume | number}}</div>
                <div class="value" ng-if="!quoteObj.totalVolume">- -</div>
            </div>
            <div class="row">
                <div class="label">52-Week High</div>
                <div class="value" ng-if="quoteObj.yearHigh">{{quoteObj.yearHigh | number:2 }}</div>
                <div class="value" ng-if="!quoteObj.yearHigh">- -</div>
            </div>
            <div class="row alt">
                <div class="label">52-Week Low</div>
                <div class="value" ng-if="quoteObj.yearLow">{{quoteObj.yearLow | number:2 }}</div>
                <div class="value" ng-if="!quoteObj.yearLow">- -</div>
            </div>
        </div>
        <div class="Column Right">
            <div class="row">
                <div class="label">1 Year Total % Return</div>
                <div class="value" ng-if="quoteObj.oneYearReturn">{{quoteObj.oneYearReturn | number:2}}</div>
                <div class="value" ng-if="!quoteObj.oneYearReturn">- -</div>
            </div>
            <div class="row alt">
                <div class="label">Earnings Per Share</div>
                <div class="value" ng-if="quoteObj.eps">{{quoteObj.eps | number:2 }}</div>
                <div class="value" ng-if="!quoteObj.eps">- -</div>
            </div>
            <div class="row">
                <div class="label">Price/Earnings Ratio</div>
                <div class="value"ng-if="quoteObj.peRatio">{{quoteObj.peRatio | number:2 }}</div>
                <div class="value" ng-if="!quoteObj.peRatio">- -</div>
            </div>
            <div class="row alt">
                <div class="label">Price-to-Book Ratio</div>
                <div class="value" ng-if="quoteObj.priceToBookRatio">{{quoteObj.priceToBookRatio | number:2}}</div>
                <div class="value" ng-if="!quoteObj.priceToBookRatio">- -</div>
            </div>
            <div class="row">
                <div class="label">Price-to-Sales Ratio</div>
                <div class="value" ng-if="quoteObj.priceToSalesRatio">{{quoteObj.priceToSalesRatio | number:2}}</div>
                <div class="value" ng-if="!quoteObj.priceToSalesRatio">- -</div>
            </div>
            <div class="row alt">
                <div class="label">Shares Outstanding</div>
                <div class="value" ng-if="quoteObj.shareOutstanding">{{quoteObj.shareOutstanding | number:2}} M</div>
                <div class="value" ng-if="!quoteObj.shareOutstanding">- -</div>
            </div>
            <div class="row">
                <div class="label">30 Day Average Volume</div>
                <div class="value" ng-if="quoteObj.thirtyDayAvgVolume">{{quoteObj.thirtyDayAvgVolume}}</div>
                <div class="value" ng-if="!quoteObj.thirtyDayAvgVolume">- -</div>
            </div>
            <div class="row alt">
                <div class="label">Exchange</div>
                <div class="value" ng-if="quoteObj.exchange">{{quoteObj.exchange}}</div>
                <div class="value" ng-if="!quoteObj.exchange">- -</div>
            </div>
            <div class="row">
                <div class="label">Currency</div>
                <div class="value" ng-if="quoteObj.currency">{{quoteObj.currency}}</div>
                <div class="value" ng-if="!quoteObj.currency">- -</div>
            </div>
            <div class="row alt">
                <div class="label">Expected Reporting Date</div>
                <div class="value" ng-if="quoteObj.expectedReportDate">{{quoteObj.expectedReportDate | date:'MMM d, yyyy'}}</div>
                <div class="value" ng-if="!quoteObj.expectedReportDate">- -</div>
            </div>
        </div>
        <div class="clear"></div>
    </div>      
    </div>
    <div class="not-found" ng-show="!quoteFound">
        <p>There was a problem retrieving the data</p>
    </div>
</div>

Вы также можете просмотреть его на Bloomberg Stock Quote для ENB: CT

Я нашел xpath для таблицы, которую я ищу и попробовал следующий код:

            HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
            HtmlAgilityPack.HtmlDocument jkdoc = web.Load("https://www.bnnbloomberg.ca/stock/ENB:CT");
            HtmlNode jnode = jkdoc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[3]/div[3]/section[1]/div[3]/div[2]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/table[1]");
            string value = jnode.InnerText;
 Console.WriteLine(value);

Строка, отображаемая на экране, содержит метки для различных разделов, но не содержит фактических значений. Вместо этого я получаю что-то вроде {{выручка | replaceEmptyValue}}

Это какая-то проблема синхронизации, когда мне приходится ждать полной загрузки страницы и заполнения значений?

1 Ответ

0 голосов
/ 30 марта 2020

Таблица выглядит просто как шаблон для Angular JavaScript фреймворка. Это означает, что соответствующие сценарии должны быть выполнены для того, чтобы он действительно был правильно отображен и заполнен данными. HtmlAgilityPack будет анализировать только HTML, полученное напрямую от сервера, что означает неопределяемую разметку шаблона.

Этот вопрос в основном сводится к тому же и может помочь вам в правильном направление.

...