如何使用 IMPORTHTML and/or IMPORTXML 导入混合文本和图像元数据的 table?

How to import table with mix of text and image metadata with IMPORTHTML and/or IMPORTXML?

我正在尝试使用 IMPORTHTML and/or IMPORTXML 函数将 table 混合文本和图像导入 Google 表格。

我要导入的 tables 是来自多个站点的 'Advancement' 部分下的 'Equipment' tables:https://stt.wiki/wiki/Xindi_%27Prisoner%27_Archer .

table中每一项的星数代表"level"从1("Common")到5("Legendary"),没有星代表等级0 ("Basic")。图像元数据包含关卡描述。 "Legendary" 级别示例:

<img alt="Legendary" src="/w/images/thumb/b/b5/StarItem.png/15px-StarItem.png" title="Legendary" width="15" height="15" style="vertical-align: sub" srcset="/w/images/thumb/b/b5/StarItem.png/23px-StarItem.png 1.5x, /w/images/thumb/b/b5/StarItem.png/30px-StarItem.png 2x">

我的问题是在导入中包含级别信息,作为图像或图像元数据。

我的最终目标是 table 像这样(手动创建):

(带有 URL 的 E 和 I 列是可选的)。


IMPORTHTML:

首先我尝试使用 IMPORTHTML 导入,单元格 A1 包含 URL(见上文)(请注意,由于本地设置,我必须在公式中使用分号):

=IMPORTHTML(A1; "table"; 4)

这给了我这个table:

很遗憾,原始 table 中的 "stars" 未导入。

1) 所以第一个问题是:有没有办法使用 IMPORTHTML 方法包含来自 table 的图像?或者图像中的元数据?


IMPORTXML:

然后我尝试使用 IMPORTXML 来获取缺失的关卡数据:

=IMPORTXML(A1; "//*[@id='mw-content-text']/div/table[3]/tbody/tr/td/span/img[1]/@alt").

IMPORTHTML 总共给了我 40 个项目,但是使用这个 IMPORTXML 我只得到了 37 个项目级别的值。这是因为使用我的 IMPORTXML 方法我没有获得有关 "Basic" 项目的信息,即没有星号的项目。

所以现在我有一个包含 37 个级别的列表和一个包含 40 个项目的 table,但它们之间没有逻辑联系。级别列表将需要在列表中正确位置的基本项目条目(可以是空白单元格),以使项目和级别之间的分配成为可能。

2) 所以我的第二个问题是:对于 IMPORTXML 方法,是否有任何方法可以在 Google 工作表中获得与原始 table 中相同数量的单元格的结果,甚至何时对于原始 table 的某些单元格,XPATH 不匹配?在这种情况下,导入可能会给出一个空单元格。 在这个例子中,这会给我一个包含 40 个单元格的列表,其中 3 个单元格是空的。


也欢迎使用 Google 工作表的其他解决方案。

你满意吗:

=ARRAYFORMULA(IFERROR(VLOOKUP(B4:B13&C4:C13, {
 IMPORTXML($A1, "//table[3]/tbody//span/img[1]/@title/preceding::td[@class='ItemRight'][1]")&
 IMPORTXML($A1, "//table[3]/tbody//span/img[1]/@title/preceding::a[1]"),
 VLOOKUP(IMPORTXML($A1, "//table[3]/tbody//span/img[1]/@title"),
 {"Common",     "★", "", "", "", "";
  "Uncommon",   "★", "★", "", "", "";
  "Rare",       "★", "★", "★", "", "";
  "Super Rare", "★", "★", "★", "★", "";
  "Legendary",  "★", "★", "★", "★", "★"}, 
 {2, 3, 4, 5, 6}, 0)}, {2, 3, 4, 5, 6}, 0)))

或原始星星:

=ARRAYFORMULA(IMAGE(SUBSTITUTE(IFERROR(VLOOKUP(B4:B13&C4:C13, {
 IMPORTXML($A1, "//table[3]/tbody//span/img[1]/@title/preceding::td[@class='ItemRight'][1]")&
 IMPORTXML($A1, "//table[3]/tbody//span/img[1]/@title/preceding::a[1]"), 
 VLOOKUP(IMPORTXML($A1, "//table[3]/tbody//span/img[1]/@title"), 
 {"Common",     "★", "", "", "", "";
  "Uncommon",   "★", "★", "", "", "";
  "Rare",       "★", "★", "★", "", "";
  "Super Rare", "★", "★", "★", "★", "";
  "Legendary",  "★", "★", "★", "★", "★"}, 
 {2, 3, 4, 5, 6}, 0)}, {2, 3, 4, 5, 6}, 0)), "★", 
 "https://stt.wiki/w/images/thumb/b/b5/StarItem.png/15px-StarItem.png"), 3))


原文:


spreadsheet demo

XPath 解决方案(使用了 6 个,检查黄色单元格):

Star.Treck.Sheet

首先我们用 IMPORTHTML 得到 table 的结构。然后使用 XPath,我们获得每个带有星号(即等级)的 ID、成员名称和级别。然后我们得到每个人的 ID 和成员名称(带星号和不带星号)。我们 VLOOKUP 构建级别 table(请参阅 join.levels)。没有星星 >> "Basic"。我们获取网址。最后,我们使用 CONCAT(ids+名称来保护连接)构建最终的 table。