从html web scrape中提取字符串

问题描述 投票:2回答:2

我正在寻找关于我正在努力的网络抓取脚本的一些指导。

一切进展顺利,但我坚持剥离图像文件数据。

我现在正在做一个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,因为文件名相同,只是一条不同的路径,我是'脏编码',但是当路径名不一致时,这种情况很快就会发生。

html powershell dom web-scraping
2个回答
1
投票

你需要访问外部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中安装和使用非常重要。

也就是说,.ParsedHTMLHtmlAgilityPack有一个工作示例,可以按需下载所需的程序集。


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


0
投票

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

.id

一个积极的lookbehind,选择所有直到结束引号和空格。

谢谢大家。

© www.soinside.com 2019 - 2024. All rights reserved.