【问题标题】:Extracting string from html web scrape从 html 网页抓取中提取字符串
【发布时间】:2019-08-06 12:17:42
【问题描述】:

我正在寻找有关我正在处理的网络抓取脚本的一些指导。

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

我目前正在做一个 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 属性来获得第一张图片。

我通过将 800x800 替换为 1600x1600 来进行“脏编码”,因为文件名相同,只是路径不同,但当路径名不一致时,很快就会出现问题。

【问题讨论】:

    标签: html powershell dom web-scraping


    【解决方案1】:

    你需要访问外部&lt;a&gt;元素的&lt;img&gt;子元素并调用它的.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 更改为使用 '...' 而不是 "..." 围绕属性值,您的解决方案就会中断(这种特殊情况在正则表达式中不难解释,但还有更多方法可以进行此类解析出错了)。


    跨平台视角

    遗憾的是,.ParsedHTML 属性及其 HTML DOM 仅在 Windows PowerShell 中可用(并且它的 COM 实现在 PowerShell 中使用起来很麻烦且缓慢)。

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

    HtmlAgilityPack NuGet 包是一种流行的开源 HTML 解析器,但它是针对 C# 的,因此在 PowerShell 中安装和使用非常重要。

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


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

    【讨论】:

    • 谢谢,@TheIncorrigible1 - 我添加了一个链接,指向您对答案的回答。在更一般的说明中,您可能会发现 this answer 关于在 PowerShell 中使用 NuGet 包通常很有趣。另外,根据我的反馈,我可以建议您在此处修改或删除您自己的答案吗?
    【解决方案2】:

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

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

    积极向后看,选择所有直到结束引号和空格。

    谢谢大家。

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 2021-07-17
      相关资源
      最近更新 更多