XPath,用于在Google表格中使用ImportXML的<address>标记

时间:2018-12-11 20:25:14

标签: xml xpath google-sheets google-sheets-formula

我正在尝试使用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>

我尝试过此路径的几种变体,经常返回“导入的内容为空”:

=importxml(A2,"//div[@class='grp-content']/footer/address/@data-aname")

任何帮助都会很棒。谢谢!

1 个答案:

答案 0 :(得分:0)

如果您的XPath被修改,怎么办?

//div[@class='grp-content']//footer//address/@data-aname

这也可以使用//address/@data-aname

如果这些不是您想要的结果,可以提供URL“ A2”吗?我想尝试测试。

编辑:

从您提供的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的标签信息。
  • 使用//*[@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脚本代替IMPORTXML()

已添加:

在这种情况下使用Google Apps脚本时。作为示例脚本,如何处理?无法直接解析此HTML数据。因此,它将使用解析器提取部分值,包括您要使用的值,并使用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上看到这些值。

参考文献: