从html web scrape提取字符串

时间:2019-03-15 12:04:44

标签: html powershell dom web-scraping

我正在寻找有关我正在使用的网络抓取脚本的指南。

一切都很好,但是我一直坚持剥离图像文件数据。

我当前正在执行WebRequest,通过类获取元素,选择externalHTML,但是根据此示例,仅需要去除属性data-imagezoom的内容。

样本数据:

<a class="aaImg" href="https://imagehost.ssl.server123.com/Product-800x800/image.jpg">
    <img class="aaTmb" alt="Matrix 900 x 900 test" src="https://imagehost.ssl.server123.com/Product-190x190/image.jpg" item="image"
         data-imagezoom="https://imagehost.ssl.server123.com/Product-1600x1600/image.jpg" data-thumbnail="https://imagehost.ssl.server123.com/Product-190x190/image.jpg">
    </img>
</a>

获取该数据的当前代码:

$ProductInfo = Invoke-WebRequest -Uri $ProductURL
$ProductImageRaw = $ProductInfo.ParsedHTML.body.getElementsByClassName("aaImg") |
                   Select outerHTML

显然,我可以通过轻松选择href属性来获取第一张图像。

我使用1600x1600替换800x800是“肮脏的编码”,因为文件名是相同的,只是路径不同,但是当路径名称不一致时,很快就会消失。

2 个答案:

答案 0 :(得分:1)

您需要访问外部<a>元素的<img>子元素并调用其 .getAttribute()方法以获取感兴趣的属性值:

$ProductInfo.ParsedHTML.body.getElementsByClassName("aaImg").
  childnodes[0].getAttribute('data-imagezoom')
  • .childnodes[0]返回第一个子节点(元素)

  • .getAttributes('data-imagezoom')返回data-imagezoom属性的值。 [1]

这应该返回字符串https://imagehost.ssl.server123.com/Product-1600x1600/image.jpg


关于your own answer

使用正则表达式(或子字符串搜索)来解析结构化数据(例如HTML和XML)是脆弱,并且最好避免。
例如,如果源HTML更改为在属性值周围使用'...'而不是"...",则您的解决方案会中断(这种特殊情况在正则表达式中不难解释,但是有很多其他方法可以使用这样的解析可能会出错)。


跨平台视角

遗憾的是,带有HTML DOM的.ParsedHTML属性仅在 Windows PowerShell 中可用(并且其COM实施繁琐且在PowerShell中使用起来很慢)。

PowerShell Core ,即使在Windows上也不支持,并且没有没有可用的内置HTML解析器(从PowerShell开始)核心6.2.0)。

HtmlAgilityPack NuGet软件包是一个流行的开源HTML解析器,但它针对的是C#,因此在PowerShell中安装和使用并不容易。

也就是说,this answerTheIncorrigible1有一个可行的示例,可以根据需要下载所需的程序集。


[1]请注意,.getAttribute()是访问 custom 属性所必需的,而 standard 属性例如id<a>元素href的情况直接表示为对象属性(例如.id;请注意,.getAttribute()也适用于标准属性。)

答案 1 :(得分:0)

因此,在经过一些Regex快速速成课程之后,这就是我想出的。

(?<=data-imagezoom=").*?(?="\s)

正向后看,请选择所有内容,直到右引号和空格为止。

谢谢。