我正在寻找有关我正在使用的网络抓取脚本的指南。
一切都很好,但是我一直坚持剥离图像文件数据。
我当前正在执行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是“肮脏的编码”,因为文件名是相同的,只是路径不同,但是当路径名称不一致时,很快就会消失。
答案 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
。
使用正则表达式(或子字符串搜索)来解析结构化数据(例如HTML和XML)是脆弱,并且最好避免。
例如,如果源HTML更改为在属性值周围使用'...'
而不是"..."
,则您的解决方案会中断(这种特殊情况在正则表达式中不难解释,但是有很多其他方法可以使用这样的解析可能会出错)。
跨平台视角:
遗憾的是,带有HTML DOM的.ParsedHTML
属性仅在 Windows PowerShell 中可用(并且其COM实施繁琐且在PowerShell中使用起来很慢)。
PowerShell Core ,即使在Windows上也不支持,并且没有没有可用的内置HTML解析器(从PowerShell开始)核心6.2.0)。
HtmlAgilityPack NuGet软件包是一个流行的开源HTML解析器,但它针对的是C#,因此在PowerShell中安装和使用并不容易。
也就是说,this answer的TheIncorrigible1有一个可行的示例,可以根据需要下载所需的程序集。
[1]请注意,.getAttribute()
是访问 custom 属性所必需的,而 standard 属性例如id
和<a>
元素href
的情况直接表示为对象属性(例如.id
;请注意,.getAttribute()
也适用于标准属性。)
答案 1 :(得分:0)
因此,在经过一些Regex快速速成课程之后,这就是我想出的。
(?<=data-imagezoom=").*?(?="\s)
正向后看,请选择所有内容,直到右引号和空格为止。
谢谢。