Getting Href property with anglesharp linq query

2019-08-14 08:15发布

问题:

I am trying to understand how to use anglesharp.

I made this code based on the example (https://github.com/AngleSharp/AngleSharp):

        // Setup the configuration to support document loading
        var config = Configuration.Default.WithDefaultLoader();
        // Load the names of all The Big Bang Theory episodes from Wikipedia
        var address = "http://store.scramblestuff.com/";
        // Asynchronously get the document in a new context using the configuration
        var document = await BrowsingContext.New(config).OpenAsync(address);
        // This CSS selector gets the desired content
        var menuSelector = "#storeleft a";
        // Perform the query to get all cells with the content
        var menuItems = document.QuerySelectorAll(menuSelector);
        // We are only interested in the text - select it with LINQ
        var titles = menuItems.Select(m => m.TextContent).ToList();

        var output = string.Join("\n", titles);

        Console.WriteLine(output);

This works as expected but now I want to access the Href property but I am unable to do this:

var links = menuItems.Select(m => m.Href).ToList();

When I look in the debugger I can see in results view that the HtmlAnchorElement enumerable object has a Href property but I am obviously not trying to access it right.

None of the examples in the documentation show a property being accessed so I guess it's something so simple that doesn't need to be shown but I am not seeing how to do it.

Can anyone show me how I should be accessing a html property with angle sharp?

edit:

This works when I cast it to the correct type

foreach (IHtmlAnchorElement menuLink in menuItems)
        {
            Console.WriteLine(menuLink.Href.ToString());
        }

How would I write that as a Linq statement like the titles variable?

回答1:

Alternative to har07's answer:

var menuItems = document.QuerySelectorAll(menuSelector).OfType<IHtmlAnchorElement>();


回答2:

You can cast to IHtmlAnchorElement as follow :

var links = menuItems.Select(m => ((IHtmlAnchorElement)m).Href).ToList();

or using Cast<IHtmlAnchorElement>() :

var links = menuItems.Cast<IHtmlAnchorElement>()
                     .Select(m => m.Href)
                     .ToList();