簡體   English   中英

XPath 用於<address>在 Google 表格中使用 ImportXML 標記

[英]XPath for an <address> tag using ImportXML in Google Sheets

我正在嘗試使用 importXML 和 Google Sheets 從新聞網站中提取文章的作者姓名。 代碼如下所示:

<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")

任何幫助都會很棒。 謝謝!

如果你的 XPath 被修改了,這個怎么樣?

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

而且這也可以使用//address/@data-aname

如果這些不是你想要的結果,你能提供“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 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 庫。 您可以在此處查看詳細信息。
  • 安裝庫后,請運行getValuesFromUrl()函數。 這樣,您可以在 Log 中看到這些值。

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM