在 Google 表格中使用 ImportXML 的 <address> 标签的 XPath
XPath for an <address> tag using ImportXML in Google Sheets
我正在尝试使用 importXML 和 Google 表格从新闻网站中提取文章的作者姓名。
代码如下所示:
<div class="grp-content">
<h2 class="title">
<div class="excerpt">
<footer class="byline">
<address data-aurl="/author/john-smith/" data-aname="JOHN
SMITH"></address>
我尝试了这条路径的几种变体,经常返回 "imported content is empty":
=importxml(A2,"//div[@class='grp-content']/footer/address/@data-aname")
任何帮助都会很棒。谢谢!
如果你的 XPath 被修改了,这个怎么样?
//div[@class='grp-content']//footer//address/@data-aname
而且这也许可以使用 //address/@data-aname
如果这些不是你想要的结果,你能提供"A2"的URL吗?我想尝试一下。
编辑:
根据您提供的URL,我确认了HTML数据。 URL中基本单元的结构如下
<div class="grp-content">
<h2 class="title">
<a href="### url ###" title="#####">#####</a>
</h2>
<div class="excerpt">
<p>#####</p>
</div>
<footer class="byline">
<address data-aurl="/author/john-smith/" data-aname="JOHN SMITH"></address>
<time datetime="2018-12-11T12:34:56Z">11 Dec 2018, 12:34 PM PST</time>
<a class="byC" href="### url ###" data-dsqi="1234567"></a>
</footer>
</div>
当使用 IMPORTXML()
从上述结构中检索值时,获得了以下结果。
成功
- 每个
a
的tabs信息都可以检索到。
- 当使用
//*[@class='byC']/@data-dsqi
和//a[@class='byC']/@data-dsqi
时,可以检索到1234567
。
使用//*[@class='byC']/../text()
和//a[@class='byC']/../text()
,可以检索到11 Dec 2018, 12:34 PM PST
。
- 当使用
//*[@class='excerpt']/../h2
和//div[@class='excerpt']/../h2
时,可以检索"h2"的文本值。
失败
- 当使用
//*[@class='byC']/../time"
和//a[@class='byC']/../time"
时,返回#N/A
。
- 当使用
//*[text()='11 Dec 2018, 12:34 PM PST']
和//*[text()='11 Dec 2018, 12:34 PM PST']/@datetime
时,返回#N/A
。
- 当使用
//*[@class='byline']/../h2
和//footer[@class='byline']/../h2
时,返回#N/A
。
解决方法
在我的环境中,无法检索 address
的值。根据以上结果,我得出 IMPORTXML()
可能无法正确解析 footer
。因此,作为一种解决方法,我想建议使用 Google Apps Script 而不是 IMPORTXML()
.
已添加:
当 Google Apps 脚本用于这种情况时。作为示例脚本,这个怎么样?此 HTML 数据无法直接解析。因此,它会使用 Parser 提取部分值,包括您要使用的值,并使用 XmlService.
解析和检索值
示例脚本:
function getValuesFromUrl() {
// Retrieve HTML data
var url = "https://www.breitbart.com/tag/cnn/";
var html = UrlFetchApp.fetch(url).getContentText();
// Parse HTML data
var res = Parser.data(html).from("<section id=\"MainW\">").to("</section>").build();
var decode = XmlService.parse('<r>' + res + '</r>');
var r = decode.getRootElement().getChildren();
// Retrieve values
var values = [];
for (var i = 0; i < r.length; i++) {
var s = r[i].getChildren("article");
for (var j = 0; j < s.length; j++) {
var t = s[j].getChildren("div");
for (var k = 0; k < t.length; k++) {
var u = t[k].getChildren("footer");
for (var l = 0; l < u.length; l++) {
values.push(u[l].getChild("address").getAttribute("data-aname").getValue());
}
}
}
}
Logger.log(values)
}
注:
- 为了使用此脚本,请将脚本复制并粘贴到脚本编辑器中。
- 在你运行脚本之前,请先安装一个Parser的GAS库。您可以在 here.
查看详细信息
- 库安装完成后,请运行使用
getValuesFromUrl()
的功能。这样,您可以在 Log. 处看到值
参考文献:
我正在尝试使用 importXML 和 Google 表格从新闻网站中提取文章的作者姓名。 代码如下所示:
<div class="grp-content">
<h2 class="title">
<div class="excerpt">
<footer class="byline">
<address data-aurl="/author/john-smith/" data-aname="JOHN
SMITH"></address>
我尝试了这条路径的几种变体,经常返回 "imported content is empty":
=importxml(A2,"//div[@class='grp-content']/footer/address/@data-aname")
任何帮助都会很棒。谢谢!
如果你的 XPath 被修改了,这个怎么样?
//div[@class='grp-content']//footer//address/@data-aname
而且这也许可以使用 //address/@data-aname
如果这些不是你想要的结果,你能提供"A2"的URL吗?我想尝试一下。
编辑:
根据您提供的URL,我确认了HTML数据。 URL中基本单元的结构如下
<div class="grp-content">
<h2 class="title">
<a href="### url ###" title="#####">#####</a>
</h2>
<div class="excerpt">
<p>#####</p>
</div>
<footer class="byline">
<address data-aurl="/author/john-smith/" data-aname="JOHN SMITH"></address>
<time datetime="2018-12-11T12:34:56Z">11 Dec 2018, 12:34 PM PST</time>
<a class="byC" href="### url ###" data-dsqi="1234567"></a>
</footer>
</div>
当使用 IMPORTXML()
从上述结构中检索值时,获得了以下结果。
- 每个
a
的tabs信息都可以检索到。 - 当使用
//*[@class='byC']/@data-dsqi
和//a[@class='byC']/@data-dsqi
时,可以检索到1234567
。
使用 //*[@class='byC']/../text()
和//a[@class='byC']/../text()
,可以检索到11 Dec 2018, 12:34 PM PST
。- 当使用
//*[@class='excerpt']/../h2
和//div[@class='excerpt']/../h2
时,可以检索"h2"的文本值。
- 当使用
//*[@class='byC']/../time"
和//a[@class='byC']/../time"
时,返回#N/A
。 - 当使用
//*[text()='11 Dec 2018, 12:34 PM PST']
和//*[text()='11 Dec 2018, 12:34 PM PST']/@datetime
时,返回#N/A
。 - 当使用
//*[@class='byline']/../h2
和//footer[@class='byline']/../h2
时,返回#N/A
。
解决方法
在我的环境中,无法检索 address
的值。根据以上结果,我得出 IMPORTXML()
可能无法正确解析 footer
。因此,作为一种解决方法,我想建议使用 Google Apps Script 而不是 IMPORTXML()
.
已添加:
当 Google Apps 脚本用于这种情况时。作为示例脚本,这个怎么样?此 HTML 数据无法直接解析。因此,它会使用 Parser 提取部分值,包括您要使用的值,并使用 XmlService.
解析和检索值示例脚本:
function getValuesFromUrl() {
// Retrieve HTML data
var url = "https://www.breitbart.com/tag/cnn/";
var html = UrlFetchApp.fetch(url).getContentText();
// Parse HTML data
var res = Parser.data(html).from("<section id=\"MainW\">").to("</section>").build();
var decode = XmlService.parse('<r>' + res + '</r>');
var r = decode.getRootElement().getChildren();
// Retrieve values
var values = [];
for (var i = 0; i < r.length; i++) {
var s = r[i].getChildren("article");
for (var j = 0; j < s.length; j++) {
var t = s[j].getChildren("div");
for (var k = 0; k < t.length; k++) {
var u = t[k].getChildren("footer");
for (var l = 0; l < u.length; l++) {
values.push(u[l].getChild("address").getAttribute("data-aname").getValue());
}
}
}
}
Logger.log(values)
}
注:
- 为了使用此脚本,请将脚本复制并粘贴到脚本编辑器中。
- 在你运行脚本之前,请先安装一个Parser的GAS库。您可以在 here. 查看详细信息
- 库安装完成后,请运行使用
getValuesFromUrl()
的功能。这样,您可以在 Log. 处看到值