You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AppleScript中重复提取两个字符串间的文本?

解决AppleScript中从HTML重复提取多组内容的问题

嘿,我明白你凌晨3点卡在这里有多崩溃——作为AppleScript新手,这种重复提取多组内容的问题确实容易让人头大。让我一步步帮你理清思路,解决这个困扰你的问题。

为什么你的现有方法只能提取一次?

你用的AppleScript's text item delimiters方法其实逻辑是通的,但只取了text item 2,相当于只抓了第一组起始/结束文本之间的内容。要提取多组,咱们得用循环不断处理剩下的字符串,把每一组目标内容都捞出来。

方案1:用循环结合Text Item Delimiters批量提取

这里给你一个可以重复提取的脚本示例,假设你的起始标记是startText,结束标记是endText:

set inputString to "你的HTML字符串"
set startText to "起始标记"
set endText to "结束标记"
set extractedValues to {}

set AppleScript's text item delimiters to startText
set splitByStart to text items of inputString

-- 跳过第一个空的text item(如果起始文本在开头的话)
repeat with i from 2 to count of splitByStart
    set currentChunk to item i of splitByStart
    set AppleScript's text item delimiters to endText
    set chunkParts to text items of currentChunk
    if count of chunkParts > 1 then
        set end of extractedValues to item 1 of chunkParts
    end if
end repeat

set AppleScript's text item delimiters to ""
-- 现在extractedValues就是所有提取到的内容组成的列表
return extractedValues

这个脚本会把所有startText和endText之间的内容都存到extractedValues列表里,完美解决单次提取的局限。

方案2:先清理HTML标签,再精准提取

你提到用wch1zpink的方法清除HTML后,内容变成了长字符串,其实这是个非常好的方向——先把所有HTML标签去掉,变成纯文本,再提取会简单很多。比如先清理标签的脚本:

set cleanedText to do shell script "echo " & quoted form of inputString & " | sed 's/<[^>]*>//g'"

清理后你的示例HTML会变成:

Customer ID:1234567890Title:Name:FirstName LastName&nbsp;&nbsp;Primary Email:test_123@google.comAccount Email:test_abc@google.com

这时候你可以针对每个目标值单独提取,比如提取客户ID:

set AppleScript's text item delimiters to "Customer ID:"
set idPart to text item 2 of cleanedText
set AppleScript's text item delimiters to "Title:"
set customerID to text item 1 of idPart

这种逐个提取的方法虽然看似繁琐,但胜在直观,适合新手快速上手,也就是你最后用的思路。如果想更高效,可以把这些提取逻辑写成一个自定义函数,重复调用即可。

方案3:用正则表达式一次性提取(进阶)

如果你想尝试更高效的方式,AppleScript可以配合do shell script用正则表达式批量提取。比如针对你的示例,提取所有标签内的非空文本:

set extractedTexts to do shell script "echo " & quoted form of inputString & " | grep -o '>[^<]*<' | sed 's/^>//;s/<$//' | sed '/^[[:space:]]*$/d'"
-- 把结果转成列表
set AppleScript's text item delimiters to linefeed
set extractedList to text items of extractedTexts
set AppleScript's text item delimiters to ""

这个脚本会提取所有>和<之间的非空文本,得到的列表里就包含了你需要的客户ID、姓名、邮箱等内容,之后你可以按索引或者关键词筛选出目标值。

最后想说的

你最后改成逐个提取的方法完全没问题,作为新手,先实现功能再优化是非常合理的路径。如果之后需要处理更多批量内容,上面的循环或正则方法会帮你节省不少时间。

内容的提问来源于stack exchange,提问作者Drew Canaima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:13:36