Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

To capture an HTML table in an ASP.NET application, fetch the page with HttpClient, parse the response into a DOM with Html Agility Pack, select the intended <table>, and read both its <th> and <td> cells. Convert each cell’s descendant text with InnerText, trim and HTML-decode it, then map the rows to the output format your application needs. This approach handles nested inline elements and is safer than extracting structured HTML with regular expressions.

What this method captures—and what it does not

This method captures table markup present in the HTML response returned by the site. It works well for server-rendered tables and pages whose response already contains the target rows. It does not run the page’s JavaScript. If JavaScript builds the table after the browser loads the page, a plain HttpClient request may retrieve only the initial document without those rows.

Fetch and inspect the response before choosing a parser or selector. If the table is absent, determine whether the site exposes the data through an endpoint or requires client-side rendering. Do not assume that a missing table means the selector is wrong.

Prerequisites

  • An ASP.NET project using a supported .NET version and access to the target URL.
  • HttpClient for retrieving the HTML. Microsoft documents the .NET HTTP client API at System.Net.Http.HttpClient.
  • The Html Agility Pack NuGet package for parsing and querying the HTML DOM. Its maintainers describe it as a C# HTML parser that supports DOM read/write and XPath/XSLT: Html Agility Pack. Package details are available on NuGet.

Fetch, parse, and capture a specific table

The example below retrieves a page, selects a table by its stable ID, includes header and data cells, decodes entities, and returns each row as a list of strings. Replace the URL and table ID with values from the page you are permitted to access.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Elebase USB to USB C Adapter for iPhone 18 Pro Max,USBC Car Charger Adapter
  • Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
  • Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
  • Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
  • Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
  • 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.
using System.Net;
using HtmlAgilityPack;

public static async Task<List<List<string>>> CaptureTableAsync(
    HttpClient httpClient,
    string pageUrl,
    CancellationToken cancellationToken = default)
{
    using var response = await httpClient.GetAsync(pageUrl, cancellationToken);
    response.EnsureSuccessStatusCode();

    var html = await response.Content.ReadAsStringAsync(cancellationToken);
    var doc = new HtmlDocument();
    doc.LoadHtml(html);

    var table = doc.DocumentNode.SelectSingleNode("//table[@id='results']");
    if (table is null)
    {
        throw new InvalidOperationException("Table with id 'results' was not found in the response HTML.");
    }

    var capturedRows = new List<List<string>>();
    var rows = table.SelectNodes(".//tr");
    if (rows is null)
    {
        return capturedRows;
    }

    foreach (var row in rows)
    {
        // Select only cells belonging to this row; include headers as well as data cells.
        var cells = row.SelectNodes("./th|./td");
        if (cells is null)
        {
            continue;
        }

        var values = cells
            .Select(cell => WebUtility.HtmlDecode(cell.InnerText).Trim())
            .ToList();

        capturedRows.Add(values);
    }

    return capturedRows;
}

In an ASP.NET Core application, register and inject HttpClient through the built-in HTTP client factory rather than creating a new client for every request. For example, register a typed or named client in the application’s service configuration, then pass the injected client to the capture method. This makes client lifetime and configuration easier to manage.

Why the selectors are scoped this way

//table[@id='results'] selects the intended table by ID rather than assuming the first table in the document is the data table. Pages can include unrelated tables for layout or navigation. Within the selected table, .//tr finds rows even when they are nested under <thead>, <tbody>, or <tfoot>. The row-level selector ./th|./td reads that row’s direct header and data cells, avoiding accidental inclusion of cells from a nested table.

What normalization handles

InnerText collects text from descendants, so a cell such as <td><span>North</span> &amp; East</td> does not require special code for the nested <span>. Trimming removes leading and trailing whitespace; WebUtility.HtmlDecode converts encoded entities such as &amp; into their text value. Preserve the raw HTML separately if the application needs formatting or links, because converting to text discards markup.

Rank #2
Anker USB-C Hub, 5-in-1 USB Hub for Laptops, 4K HDMI Multiport Adapter
  • 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
  • 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
  • Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
  • 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
  • What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.

Choose the table and map its rows

Use a stable, narrow selector

Prefer a unique ID, a distinctive class, or a narrowly scoped XPath that reflects the target page’s actual structure. If there is no ID, for example, select a table by class and verify the result count before processing. Avoid broad selectors that silently capture a navigation or nested layout table. Html Agility Pack’s XPath support is useful when the document is imperfect or selectors need to express relationships between elements.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A missing selector result should be treated as an expected failure condition, not ignored. Log enough context to identify the page and selector, and alert or return a clear error when markup changes. Also track the number of cells in rows: a changed column count can otherwise produce incorrectly mapped records without an exception.

Convert rows into application data

The example returns string lists because HTML cell values arrive as text. For a known schema, map the header row and subsequent rows into a typed object, validate required columns, then parse values using explicit culture and date rules. For instance, a price should be parsed with a culture appropriate to the source rather than the server’s current locale. Decide how to handle empty cells and rows with missing or extra columns before writing records to a database.

Rank #3
Sale
Anker USB C Hub, 7in1 Multi-Port USB Adapter, 4K@60Hz USBC to HDMI Splitter
  • Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
  • Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
  • Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
  • Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
  • What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.

For further processing, the captured values can be written to a DataTable, serialized as JSON, emitted as CSV or text, or stored in a database. Aspose’s .NET documentation demonstrates table traversal and CSV/TXT-oriented export, with JSON and database destinations also possible: Aspose.HTML for .NET documentation.

Parser options for ASP.NET projects

Approach Selector and workflow When it fits Considerations
Html Agility Pack XPath-based DOM parsing; retrieve HTML separately or use an appropriate loading helper. A free NuGet library is a good fit when you need XPath and tolerance for real-world or imperfect HTML. Map and export rows in your application code. Confirm package details and licensing for your project.
Aspose.HTML for .NET Documented CSS selection, including QuerySelector and QuerySelectorAll, with URL or file loading examples. Consider it when a supported commercial component, CSS selectors, link extraction, or export-oriented examples are useful. Commercial licensing may apply; check current product terms and API details in its documentation.
AngleSharp An alternative HTML5 parser in the .NET package ecosystem. Consider it if an HTML5-oriented parser suits the application’s requirements. Verify the current API, maintenance status, and licensing for the version selected; these vary over time.

Choose based on the markup you receive, selector model, loading needs, export requirements, licensing, and package maintenance. For a straightforward scrape of an existing response, Html Agility Pack is a practical starting point. A browser-based renderer is a separate requirement when the table only exists after scripts execute.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Handle common capture failures

The table is not found

First inspect the response HTML, not just the browser view. The request may have returned a different page, an error document, or markup without the table. If the table is present, check whether its ID or class changed and update the selector. If it is absent but appears in the browser, determine whether JavaScript or a data endpoint supplies it.

Rank #4
Sale
UGREEN USB to USB C Adapter Combo 4-Pack, 10Gbps USB C Converter Space Gray
  • Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
  • Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
  • Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
  • Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
  • Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft

Headers or columns are missing

If the code selects only td, header cells marked th are omitted. Use ./th|./td for both cell types. If output is still shifted, check for rows with a different number of cells, including rows containing a cell with colspan or rowspan; those attributes affect visual layout and need explicit handling if the output must match displayed columns.

Nested content or entities look wrong

Use InnerText to collect descendant text, then trim and HTML-decode it. If the desired value is an attribute—such as a link destination—read the relevant node attribute instead of expecting it in the text. If line breaks or spacing carry meaning, define a normalization policy rather than collapsing all whitespace indiscriminately.

The parser returns null or the page structure drifts

Html Agility Pack can represent imperfect markup, but your XPath must still match the document it parsed. Null-check SelectSingleNode and SelectNodes, scope selectors to the intended table, and log missing tables or changed column counts. Do not assume every table has a tbody element in the source.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Best Value
Anker USB C Hub, 5-in-1 USBC to HDMI Splitter with 4K Display
  • 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
  • Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
  • Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
  • HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
  • What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.

The request is blocked or fails

Check the HTTP status code, response body, and request duration. Authentication, rate limits, robots policies, and anti-bot controls depend on the target site; they are not solved by changing the HTML parser. Respect the site’s terms and access rules, and use an authorized API or authentication flow when required. Avoid aggressive retry loops that can worsen rate limiting.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Performance, reliability, and cost considerations

  • Reuse HTTP infrastructure: use an injected or factory-managed HttpClient in a long-running ASP.NET application. Apply cancellation and an explicit timeout policy suited to the target.
  • Bound the work: set reasonable response-size limits for your use case, and avoid retaining full documents longer than necessary. For many pages, control concurrency and respect the source’s rate limits.
  • Make results observable: record the target, status, elapsed time, selected table presence, and row/column counts. Avoid logging secrets or unnecessary personal data from page content.
  • Expect markup changes: selectors are coupled to a website’s HTML. Validate schema and handle missing or shifted columns instead of persisting silently corrupted rows.
  • Separate fetch from parse: keeping the parser function independent from the HTTP request makes it easier to test with representative HTML fixtures and diagnose whether a failure is network-related or structural.

This workflow uses an open-source parser package and your application’s HTTP client; no performance benchmark or fixed capture cost is established here. Any external service, network transfer, or commercial parser licensing has its own terms and cost.

Or skip the browser setup

If you need a rendered screenshot or PDF rather than extracting table values into C# objects, ScreenshotNeo is a website screenshot API and MCP server for developers. A single GET request can return PNG, JPEG, WebP, or PDF output. Its clean-shot options accept cookie or consent banners like a visitor and remove more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be turned off. Bot checks/CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, with response headers identifying the page verdict and billing status. Its MCP server provides take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients.

Example cURL request:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo API documentation for request options and response details. ScreenshotNeo captures page images or PDFs; it does not replace DOM parsing when your application needs individual table cells as structured data. The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Sign up for 1,000 free screenshots a month, with no card required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Frequently Asked Questions

Can Html Agility Pack execute JavaScript on the page?

No. It parses HTML it receives; it does not run client-side scripts that create a table after page load.

Should I use regex to extract table cells?

No for arbitrary HTML tables. A DOM parser is better suited to nested elements and imperfect markup.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.