如何优化来自同一网站的多个 importxml?
How to optimize many importxml from the same website?
我有一个 Google Sheet,其中行是产品,列是关于这些产品的信息(Material、颜色、价格...)。
这些信息是使用函数 IMPORTXML 和相应的 xpath 查询来检索的。在下面的示例中,D 列是该产品的 URL。这些函数检索第 3 行产品的信息(玻璃、颜色和类型):
=IMPORTXML(D3,"//table[@class='info-table']/tr[th/text()[contains(.,'Glass')]]/td")
=IMPORTXML(D3,"//table[@class='info-table']/tr[th/text()[contains(.,'Color')]]/td")
=IMPORTXML(D3,"//table[@class='info-table']/tr[th/text()[contains(.,'Type')]]/td")
对于每个产品,大约有 10 个列被检索,因此有 10 个不同的函数 IMPORTXML 用于相同的 URL。
当产品很少时它工作正常,但当产品太多时只检索一些信息,其他单元格保持冻结状态,值为“正在加载...”。
我找到的唯一解决方法是 手动 copy/pasting 检索到的值(Ctrl+C、Ctrl+Maj+v),然后其他一些单元格被解锁并开始导入值。最后,我需要对所有单元格都执行此操作,这会花费很多时间。
- 为什么我的细胞在“加载中...”中保持冻结状态? Google 是否有限制?
- 我是否应该调整我的函数以优化流程,并在可能的情况下减少 IMPORTXML 函数的数量?
- 你有比我耗时的解决方法更好的解决方案吗?
- xpath 查询总是非常相似。是否可以使用预定义元素列表。然后使用其他 Google Sheet 函数获得相同的结果,但只有一个 IMPORTXML 函数
例如:
=IMPORTXML(D3,"//table[@class='info-table']/tr[th/text()[contains(.,{'Glass', 'Color', 'Type'})]]/td")
可以通过调整 xpath 查询并结合使用不同的 Google 电子表格公式来解决此问题。
- 可以使用字符 |
组合多个 xpath 查询
- 要只获得第一个结果,您可以用 (YOUR_XPATH)[1]
包围 xpath 查询
- TRANSPOSE 函数会将多个结果移动到同一行
例如:
=TRANSPOSE(IMPORTXML(D2,"
(//table[@class='info-table']/tr[th/text()[contains(.,'Diameter')]]/td)[1] |
(//table[@class='info-table']/tr[th/text()[contains(.,'Material')]]/td)[1] |
(//table[@class='info-table']/tr[th/text()[contains(.,'Glass')]]/td)[1] |
(//table[@class='info-table']/tr[th/text()[contains(.,'W/R')]]/td)[1] |
(//table[@class='info-table']/tr[th/text()[contains(.,'Caliber')]]/td)[1] |
(//table[@class='info-table']/tr[th/text()[contains(.,'Type')]]/td)[1]"))
这样做,每个产品只有一个 importXML。
我有一个 Google Sheet,其中行是产品,列是关于这些产品的信息(Material、颜色、价格...)。
这些信息是使用函数 IMPORTXML 和相应的 xpath 查询来检索的。在下面的示例中,D 列是该产品的 URL。这些函数检索第 3 行产品的信息(玻璃、颜色和类型):
=IMPORTXML(D3,"//table[@class='info-table']/tr[th/text()[contains(.,'Glass')]]/td")
=IMPORTXML(D3,"//table[@class='info-table']/tr[th/text()[contains(.,'Color')]]/td")
=IMPORTXML(D3,"//table[@class='info-table']/tr[th/text()[contains(.,'Type')]]/td")
对于每个产品,大约有 10 个列被检索,因此有 10 个不同的函数 IMPORTXML 用于相同的 URL。
当产品很少时它工作正常,但当产品太多时只检索一些信息,其他单元格保持冻结状态,值为“正在加载...”。
我找到的唯一解决方法是 手动 copy/pasting 检索到的值(Ctrl+C、Ctrl+Maj+v),然后其他一些单元格被解锁并开始导入值。最后,我需要对所有单元格都执行此操作,这会花费很多时间。
- 为什么我的细胞在“加载中...”中保持冻结状态? Google 是否有限制?
- 我是否应该调整我的函数以优化流程,并在可能的情况下减少 IMPORTXML 函数的数量?
- 你有比我耗时的解决方法更好的解决方案吗?
- xpath 查询总是非常相似。是否可以使用预定义元素列表。然后使用其他 Google Sheet 函数获得相同的结果,但只有一个 IMPORTXML 函数
例如:
=IMPORTXML(D3,"//table[@class='info-table']/tr[th/text()[contains(.,{'Glass', 'Color', 'Type'})]]/td")
可以通过调整 xpath 查询并结合使用不同的 Google 电子表格公式来解决此问题。
- 可以使用字符 | 组合多个 xpath 查询
- 要只获得第一个结果,您可以用 (YOUR_XPATH)[1] 包围 xpath 查询
- TRANSPOSE 函数会将多个结果移动到同一行
例如:
=TRANSPOSE(IMPORTXML(D2,"
(//table[@class='info-table']/tr[th/text()[contains(.,'Diameter')]]/td)[1] |
(//table[@class='info-table']/tr[th/text()[contains(.,'Material')]]/td)[1] |
(//table[@class='info-table']/tr[th/text()[contains(.,'Glass')]]/td)[1] |
(//table[@class='info-table']/tr[th/text()[contains(.,'W/R')]]/td)[1] |
(//table[@class='info-table']/tr[th/text()[contains(.,'Caliber')]]/td)[1] |
(//table[@class='info-table']/tr[th/text()[contains(.,'Type')]]/td)[1]"))
这样做,每个产品只有一个 importXML。