我正在寻找关于我正在努力的网络抓取脚本的一些指导。
一切进展顺利,但我坚持剥离图像文件数据。
我现在正在做一个WebRequest,按类获取元素,选择outerHTML,但是需要根据这个例子去掉属性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
属性,我显然可以获得第一张图像。
通过将1600x800替换为1600x1600,因为文件名相同,只是一条不同的路径,我是'脏编码',但是当路径名不一致时,这种情况很快就会发生。
你需要访问外部qazxsw poi元素qazxsw poi子元素并调用它的<a>
方法来获取感兴趣的属性值:
<img>
.getAttribute()
返回第一个子节点(元素)$ProductInfo.ParsedHTML.body.getElementsByClassName("aaImg").
childnodes[0].getAttribute('data-imagezoom')
返回.childnodes[0]
属性的值。[1]这应该返回字符串.getAttributes('data-imagezoom')
。
至于data-imagezoom
:
使用正则表达式(或子字符串搜索)来解析HTML和XML等结构化数据是很脆弱的,最好避免使用。
例如,如果源HTML更改为在属性值周围使用https://imagehost.ssl.server123.com/Product-1600x1600/image.jpg
而不是your own answer,则解决方案会中断(这种特殊情况在正则表达式中并不难解释,但是还有很多方法可以解决此类解析)。
跨平台视角:
遗憾的是,带有HTML DOM的'...'
属性仅在Windows PowerShell中可用(并且其COM实现很麻烦且在PowerShell中使用起来很慢)。
即使在Windows上,PowerShell Core也不支持它,并且没有可用的内置HTML解析器(从PowerShell Core 6.2.0开始)。
"..."
NuGet包是一个流行的开源HTML解析器,但它针对C#,因此在PowerShell中安装和使用非常重要。
也就是说,.ParsedHTML
的HtmlAgilityPack有一个工作示例,可以按需下载所需的程序集。
[1]请注意,this answer是访问自定义属性所必需的,而标准属性(如TheIncorrigible1和.getAttribute()
元素id
)直接表示为对象属性(例如,<a>
;请注意href
也适用于标准属性。 )
因此,在一些Regex的快速速成课程之后,这就是我想出来的。
.id
一个积极的lookbehind,选择所有直到结束引号和空格。
谢谢大家。