有没有办法使用 Power Query 从跨度中提取“标题”属性内容?

Posted

技术标签:

【中文标题】有没有办法使用 Power Query 从跨度中提取“标题”属性内容?【英文标题】:Is there a way to extract the "title" attribute content from a span using Power Query? 【发布时间】:2020-07-07 17:29:12 【问题描述】:

我正在尝试从网站上抓取一些数据,但我需要 span 标签中包含的日期/时间,如下所示:

<span class="hourAgo ng-binding" title="07/07/2020 às 09:43:33">Há 3 horas</span>

PowerQuery 看起来像这样:

    Source = Web.BrowserContents("https://www.reclameaqui.com.br/empresa/nestle/lista-reclamacoes/"),
    #"Extracted Table From html" = 
        Html.Table(Source, 
            "Column1", ".text-title"
            , 
            "Column2", ".text-description"
            , 
            "Column3", ".status-text"
            , 
            "Column4", ".hourAgo" <<<<<<< Here's the class selector I got, but I need the title content
            , 
            "Column5", ".mdi-map-marker + *"
            , 
            [RowSelector=".complain-list:nth-child(1) LI"]),

    #"Changed Type" = Table.TransformColumnTypes(#"Extracted Table From Html",
            "Column1", type text
            , 
            "Column2", type text
            , 
            "Column3", type text
            , 
            "Column4", type text
            , 
            "Column5", type text
            )
in
    #"Changed Type"

所有其他列都很好。到目前为止,该代码返回了“Há 3 horas”跨度内容。

【问题讨论】:

【参考方案1】:

您可能希望单独提取该标题,因为它位于 span 标记内,这意味着您必须将站点解析为文本而不是 HTML。

    按换行符(新行)分割 HTML 文本。 转换为表格。 过滤以仅获取包含"hourAgo" 的行。 提取引号之间的日期。
let
    Source = Web.BrowserContents("https://www.reclameaqui.com.br/empresa/nestle/lista-reclamacoes/"),
    #"Split Text" = Text.Split(Source, "#(lf)"),
    #"Converted to Table" = Table.FromList(#"Split Text", Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Filtered Rows" = Table.SelectRows(#"Converted to Table", each Text.Contains([Column1], "hourAgo")),
    #"Extracted Text Between Delimiters" = Table.TransformColumns(#"Filtered Rows", "Column1", each Text.BetweenDelimiters(_, "<span class=""hourAgo ng-binding"" title=""", """>"), type text)
in
    #"Extracted Text Between Delimiters"


您也可以稍作更改以包含其他列之一,以便您可以与原始表格合并:

let
    Source = Web.BrowserContents("https://www.reclameaqui.com.br/empresa/nestle/lista-reclamacoes/"),
    #"Split Text" = Text.Split(Source, "#(lf)"),
    #"Converted to Table" = Table.FromList(#"Split Text", Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Filtered Rows" = Table.SelectRows(#"Converted to Table", each Text.Contains([Column1], "hourAgo")),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Filtered Rows", "Column1", Splitter.SplitTextByDelimiter("</span>", QuoteStyle.Csv), "Column1.1", "Column1.2", "Column1.3", "Column1.4", "Column1.5", "Column1.6", "Column1.7", "Column1.8", "Column1.9", "Column1.10", "Column1.11"),
    #"Removed Other Columns" = Table.SelectColumns(#"Split Column by Delimiter","Column1.4", "Column1.7"),
    #"Extracted Text After Delimiter" = Table.TransformColumns(#"Removed Other Columns", "Column1.4", each Text.BetweenDelimiters(_, "title=", ">"), type text, "Column1.7", each Text.Trim(Text.AfterDelimiter(_, ">")), type text)
in
    #"Extracted Text After Delimiter"

【讨论】:

天啊,非常感谢!如果我理解正确的话,提取“标题”内容的过程与我在原始查询中进行的正常网络抓取完全不同,对吧? 它将其作为文本而不是 HTML 进行抓取。解析为 HTML 会忽略 HTML 标记中的任何细节。 非常感谢您提供的所有信息和帮助!你能推荐任何我可以深入研究的好资源吗?我还需要获取每个投诉的 URL,是否可以调整您给我的代码? 不是特别深。我只是尝试了几种使用 GUI 进行拆分和提取的不同方法。通过一些提取/转换text funcitons,您可以走很长一段路。

以上是关于有没有办法使用 Power Query 从跨度中提取“标题”属性内容?的主要内容,如果未能解决你的问题,请参考以下文章

power query展开表时动态获取要展开的列

使用 Power Query 从 Excel 缩进中提取层次结构

通过 Power Query 在 Excel 中的 Smartsheet 数据

VBA 中的 Power Query 绝对路径问题

在 Power Query 中拆分列而不转换为文本?

powerquery中使用原始列名作为前缀 啥意思?