Well, another Friday and what goes better with it than beer. Of course I should mix in a little PowerShell as well. I live in the Syracuse, NY area and we have a terrific local brewery, Middle Ages Brewing Company. Not only is there a tasting room, but I can also get growler refills. Middle Ages brews a number of beers throughout the year and beers available for growlers vary. Fortunately they post online what is currently available.
ManageEngine ADManager Plus - Download Free Trial
Exclusive offer on ADManager Plus for US and UK regions. Claim now!
But I can't be bothered to open a web browser and visit their site everytime I want to see what they have. That's what PowerShell is for. Specifically PowerShell 3.0 and Invoke-Webrequest. With only a few lines of PowerShell, actually it could be done as a one-liner, I can get the list of beers available for growler refills. Let me break it down.
First, I'll grab the web page with Invoke-WebRequest
PS Scripts:\> $ma = Invoke-Webrequest http://middleagesbrewing.com/
Invoke-Webrequest "packages" it as a nice object.
On the page, the growler refills have links pages for the respective beers. This is handy because I can get all the links from the object I just pulled down.
PS Scripts:\> $ma.links[-2] innerHTML : <SPAN>Wailing Wench</SPAN> innerText : Wailing Wench outerHTML : <A href="/beers/wailing-wench"><SPAN>Wailing Wench</SPAN></A> outerText : Wailing Wench tagName : A href : /beers/wailing-wench
Naturally there are other links as well, but after looking through them I realized all the ones I was interested in had /beers/ in the href property. Knowing that, I can filter.
PS Scripts:\> $ma.links | where {$_.href -match "/beers/"} innerHTML : <SPAN>Double Wit</SPAN> innerText : Double Wit outerHTML : <A href="/beers/double-wit"><SPAN>Double Wit</SPAN></A> outerText : Double Wit tagName : A href : /beers/double-wit innerHTML : <SPAN>Druid Fluid</SPAN> innerText : Druid Fluid outerHTML : <A href="/beers/druid-fluid"><SPAN>Druid Fluid</SPAN></A> outerText : Druid Fluid tagName : A href : /beers/druid-fluid ...
Excellent. All I need is to grab one of the text properties and I have my list.
PS Scripts:\> $ma.links | where {$_.href -match "/beers/"} | select -expand InnerText Double Wit Druid Fluid ImPaled Ale Kilt Tilter Middle Ages Pale Ale Session IPA Swallow Wit The Duke of Winship Tripel Crown Wailing Wench
Perfect (and I'm getting a little thirsty). My script, such as it is comes down to two lines.
$ma = Invoke-Webrequest http://middleagesbrewing.com/ $ma.links | where {$_.href -match "/beers/"} | select -expand InnerText
This could even be consolidated down to a one-liner:
((Invoke-Webrequest http://middleagesbrewing.com/).Links | where {$_.href -match "/beers/"}).InnerText
Although there's no practical reason to do so. If you are new to PowerShell that is a little more difficult to understand. Normally I prefer sending objects to the pipeline but all I really need to see are beer names so this works just fine for me.
I see they are filling growlers with the Duke of Winship porter, one of my faves, so I'd better wrap this up. Cheers!