【问题标题】:XPath for an <address> tag using ImportXML in Google Sheets在 Google 表格中使用 ImportXML 的 <address> 标记的 XPath
【发布时间】:2019-05-12 21:31:35
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    如果你的 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的标签信息。
    • 使用//*[@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 数据。因此它会使用 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 中看到值。

    参考资料:

    【讨论】:

    • 感谢您的建议!我都试过了,结果是“导入的内容为空”。这是我一直在使用的链接。 breitbart.com/tag/cnn
    • @Edd 感谢您提供 URL。我确认了从 URL 检索到的 HTML 数据。所以我更新了我的答案。你能确认一下吗?因此,我建议使用 Google Apps Script。对于这种情况,我真的很抱歉。如果您不想使用它,请告诉我。那个时候,我的答案不得不被删除,因为我的答案没有用。
    • 感谢您的详细回复!我是 XPath 的新手,担心我可能忽略了一些东西。你的回答证实了我的结果。非常感激。看来我要深入研究应用脚本了。
    • @Edd 感谢您的快速回复。我添加了 Google Apps 脚本的示例脚本。如果这对你有用,我很高兴。
    • 哇!非常感谢!非常感谢您抽出时间帮助我找到解决方案。
    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多