有没有办法使用 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 从 Excel 缩进中提取层次结构