【问题标题】:IMPORTXML error alert: “Internal import error” - How to avoid the error by importing the data directly via script?IMPORTXML 错误警报:“内部导入错误” - 如何通过脚本直接导入数据来避免错误?
【发布时间】:2020-10-18 18:54:17
【问题描述】:

我正在寻找的解决方案:由于 IMPORTXML 无法导入 数据,有没有办法直接通过脚本导入数据而不用 需要在电子表格中创建公式?我无法创建自定义公式,因为这些公式有使用限制,因为我会使用很多,限制总是会发生,不会发生。

Xpath 完全正确,但有时会莫名其妙地出现此错误,我无法理解可能发生的情况。

=
IMPORTXML("https://int.soccerway.com"&
IMPORTXML(A1,
"//*[@class='container left']//*[@class='last-five']/a[1]/@href"),
"//*[@class='playerstats lineups table']//@href")

错误
内部导入错误

电子表格链接:
https://docs.google.com/spreadsheets/d/1nA3NFKhrON8wJgBiX0XcyEQqk6OZVoB3VrGaROsNPjc/edit?usp=sharing

【问题讨论】:

    标签: google-apps-script xpath web-scraping google-sheets google-sheets-importxml


    【解决方案1】:

    要完成,您可以使用以下命令缩短您的第一个 XPath:

    (//a[@title][2])[2]/@href
    

    编辑:由于这个 XPath 有时会失败,所以坚持下去:

    //div[@class='container right']/div[@class='last-five']/a[2]/@href
    

    要仅选择球员(不是教练)和替补球员(谁出场),您可以使用:

    //div[@class="combined-lineups-container"]//a[@href[contains(.,"players")]][not(parent::p[@class="substitute substitute-out"] or count(ancestor::td/p)=1)]/@href
    

    编辑

    这是一个WORKBOOK,可与IMPORTXMLIMPORTFROMWEB addon 一起使用(免费计划的请求数量受到限制)。

    第一张纸是IMPORTXML(一个衬里)。公式:

    =IMPORTXML("https://int.soccerway.com/"&IMPORTXML(C1;"//div[@class='container right']/div[@class='last-five']/a[2]/@href");"//div[@class='combined-lineups-container']//a[@href[contains(.,'players')]]/@href")
    

    第二张是IMPORTHTML(分为两部分)。使用的 XPath(获取 url、玩家 url、玩过比赛的玩家 url):

    //div[@class="container right"]/div[@class="last-five"]/a[2]/@href
    //div[@class="combined-lineups-container"]//a[@href[contains(.,"players")]]/@href
    //div[@class="combined-lineups-container"]//a[@href[contains(.,"players")]][not(parent::p[@class="substitute substitute-out"] or count(ancestor::td/p)=1)]/@href
    

    第三张是IMPORTHTML(一个衬垫)。使用的公式:

    =IMPORTFROMWEB("https://int.soccerway.com/"&IMPORTFROMWEB(C1;"//div[@class='container right']/div[@class='last-five']/a[2]/@href");"//div[@class='combined-lineups-container']//a[@href[contains(.,'players')]]/@href")
    

    如果使用 IMPORTXMLIMPORTFROMWEB 失败,则另一种选择:IMPORTDATA + 正则表达式。

    要使用起始 url 生成第二个 url(第二个 url),请使用类似:

    ="https://int.soccerway.com"&REGEXEXTRACT(INDEX(QUERY(IMPORTDATA(A2);"select * WHERE Col1 ENDS WITH '>D</a>' or Col1 ENDS WITH '>W</a>' or Col1 ENDS WITH '>L</a>'");7;1);"href=""(.*?)""")
    

    QUERY 可以使用“匹配”进行优化。

    要获取玩家名称(Players v1),请使用:

    =ARRAYFORMULA(REGEXEXTRACT(QUERY(IMPORTDATA(B2);"select Col1 WHERE Col1 STARTS WITH '<a' and Col1 CONTAINS 'flag_16 left' and Col1 CONTAINS 'players'");"href=""(.*?)"""))
    

    您可以查阅我的表格HERE

    • 蓝色背景的单元格包含公式(主要是 ARRAYFORMULA)
    • 黄色背景的单元格:获取数据的捷径
    • 粉红色背景的单元格:过滤真正参加比赛的球员的另一种方法(有点复杂,可以优化)

    编辑 2:“阵容”工作表已添加到 IMPORTDATA 工作簿。这是一个提取起始 url 的主客队最近 3 场比赛的阵容(22 名球员)的示例。示例:Lugano vs. Basel - 1 July 2020

    有时,Soccerway 没有阵容。在这种情况下,将返回“无阵容”。

    【讨论】:

    • 不幸的是,失败一直在发生。电子表格链接:docs.google.com/spreadsheets/d/…
    • 嗨。使用多个解决方案和 2 个共享工作簿编辑帖子。
    • 非常感谢您花费所有时间来创建答案,对此我深表歉意,但不幸的是,提到的选项最终与我的需求不符,这些选项实际上指定了“玩家统计”阵容表”字段有时会继续失败,并且带有 IMPORTDATA 的选项无法忠实地过滤“球员统计表”中的数据我将尝试改变问题的方法并寻找一个选项来导入数据而不使用公式在单元格中并尝试​​通过脚本直接收集。
    • 嗨。我已经用另一张表更新了IMPORTDATA 工作簿:“阵容”。我想你可以优化一下。它获取起始 url 的主客队最近 3 场比赛的阵容(22 名球员)。这种方法我没有遇到任何过滤问题(你有例子吗?)。此外,目前还没有神秘的“失踪”(不像IMPORTXML)。
    • 我一回到家就让她测试几场比赛来确认,非常感谢你所做的一切,我从你发送和解释的信息中学到了很多!
    【解决方案2】:

    当使用IMPORTXML 时,通常在尝试进行网络抓取时会发生“神秘”错误,并且我们无法采取任何措施来避免它们,特别是当数据源属于第三方时,我们只能制定应急措施。

    要做到这一点,您可以使用算法exponential backoff,简而言之,这是这样工作的:

    使用循环尝试获取数据,获取数据后退出。在每次迭代中都包含一个应该增加的延迟。您应该决定是否设置迭代次数的限制,或者是否应该在获得数据之前这样做。

    通常您应该设置一个限制和某种警报,以便您可以调查正在发生的事情。

    另一方面,Google Apps 脚本不包含解析 HTML 的好工具。

    • 有 XmlService,但它只适用于格式良好的 XHTML。
    • 虽然可以使用正则表达式来提取一些文本,但这是 hacky

    相关

    【讨论】:

      【解决方案3】:

      尝试:

      =IFERROR(IMPORTXML("https://int.soccerway.com"&
       IMPORTXML("https://int.soccerway.com/matches/2020/06/28/austria/bundesliga/lask-linz/wolfsberger-athletik-club/3246469/",
       "//*[@class='container right']//*[@class='last-five']/a[2]/@href"),
       "//*[@class='playerstats lineups table']//@href"), 
       IMPORTXML("https://int.soccerway.com"&
       IMPORTXML("https://int.soccerway.com/matches/2020/06/28/austria/bundesliga/lask-linz/wolfsberger-athletik-club/3246469/",
       "//*[@class='container right']//*[@class='last-five']/a[2]/@href"),
       "//*[@class='playerstats lineups table']//@href"))
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      相关资源
      最近更新 更多