【问题标题】:How can I save all href values from list items to a text file with iMacros?如何使用 iMacros 将列表项中的所有 href 值保存到文本文件中?
【发布时间】:2021-07-19 15:05:22
【问题描述】:

我是 imacros 的新手,但安装了版本 12.0.501.6698 Windows 10 Pro 20H2 - OS Build 19042.1110。

我正在尝试从页面的 html 中提取位于多个列表项中的所有 href 值。然后将这些 URL 保存到文本文件中。

列表项的数量可以不同,因此我不能使用已知迭代次数的循环;我必须抓取所有列表项并提取 href 属性值。

html代码格式示例

<ul class="bullet-list columns-2 columns--regular">
<li><a href="/search/agents/results.htm?location=ampthill" >Estate Agents in Ampthill</a></li>
<li><a href="/search/agents/results.htm?location=barton_le_clay" >Estate Agents in Barton-Le-Clay</a></li>
<li><a href="/search/agents/results.htm?location=bedford" >Estate Agents in Bedford</a></li>
<li><a href="/search/agents/results.htm?location=biggleswade" >Estate Agents in Biggleswade</a></li>
<li><a href="/search/agents/results.htm?location=bromham" >Estate Agents in Bromham</a></li>
<li><a href="/search/agents/results.htm?location=clapham_beds" >Estate Agents in Clapham</a></li>
</ul>

我看过类似文章中的代码,例如-iMacros: Extract ID attribute from a ul li list

这是我在 imacros 中尝试过的代码。

VERSION BUILD=12.0.501.6698
TAB T=1
SET !ERRORIGNORE YES
SET !EXTRACT_TEST_POPUP NO
TAB CLOSEALLOTHERS
'SET !PLAYBACKDELAY 0.00
URL GOTO=https://www.home.co.uk/search/agents/?county=beds

TAG POS=1 TYPE=UL ATTR=ID:bullet-list EXTRACT=LI
TAG POS=R{{!LOOP}} TYPE=A ATTR=ID:* EXTRACT=HREF
SAVEAS TYPE=EXTRACT FOLDER=* FILE=c:\Development\towns.txt

我收到一个错误框

我还尝试修改 TYPE 值的所有排列以及要提取的内容。

应该在这一行中存储来自 href 属性的 URL 的文本文件:

<li><a href="/search/agents/results.htm?location=clapham_beds" >Estate Agents in Clapham</a></li>

只包含一行 #EANF# 而不是“/search/agents/results.htm?location=clapham_beds”

【问题讨论】:

  • 嗯,好吧,可能是几个月以来iMacros 标签 (imacros) 中的第一个“质量”Qt 给了你一个“+1”,=> 赞美......!我打算发布一个答案(几个解决方案),但是嗯...,您能正确地更正“iMacros”的拼写(x3 次!)...?,+ 将您的操作系统添加到您的 FCI...? (=> Win7/Win10_x32/_64,我想)。 + 也许更正关于“知道”=>“已知”的错字...? [本网站标签中的高级用户、iMacros 论坛上的 Mod 和“数据提取”子论坛的“技术大师”...]
  • @isherwood,我发现您的 EDIT 一点用处都没有,(对于 Thread/Qt 标题),相反...原始标题“iM[A]cros 将所有 HREF 保存在 LI 中在一个命名的 UL 到一个文本文件中”比你的编辑更好,并且对 iMacros 用户来说更清晰......,并且还包含标签的名称...... +你忘记编辑剩下的 2 个错误拼写用于正文中的“iMacros”。但感谢您纠正“已知”错字。
  • 你话很多。随时进行进一步的编辑——我们都是这里的志愿者。如果您将href 称为“标签”,则它不是标签。这是一个属性。如果您将某些内容称为站点标签,则它们不属于标题,除非包含在问题本身中。 (并且标题应该是明确的,具体的问题。)此外,无需将您的凭据转储到 cmets。
  • 没有“iMacros”(拼写错误)是产品/软件/Prog-Lang 的名称和我的意思的标签 (imacros)。 HREF 只是 iMacros Prog-Lang 中的一个“属性”。我不再自己进行编辑,因为我通常必须等待 24 小时或更长时间才能被接受,并且大多数时间会在几天或几周后“Romba”或用户删除 Qt 时再次消失......(哦...!,更正 4 个错别字也不会超过 6 个字符的编辑限制...)
  • 哦,但是好的,“iMacros”以“with iMacros”重新出现在标题中......(现在拼写正确,很好......!)。 HREF + LI + UL 用作标题中的关键字很有用,您的“新”标题可以添加到正文中,但是好的,没关系...

标签: html web-scraping imacros


【解决方案1】:

iMacros 论坛上的并行线程(由我打开...,因为我不太相信这个网站的“连续性”...):

[答案现在或多或少“完成”,但我仍可能“稍微”编辑它...]

[撰写此答案所花费的时间:大约 [10] 小时...]...
=> 论坛发帖:约 2 小时,编写脚本和测试:...其余的,啊-啊...!
(这是我第一次在答案上花费这么多时间,不得不“对抗”网站的“设计”……)


以相反的顺序或多或少地解决所有不同的 Qt,+ 在“简约”实现/脚本中发布 2 个(或实际上是 3 个)不同的解决方案/实现,我将提到几个我不会解释的概念/技术(在深度)或者我需要引用一半的 Wiki 和/或 iMacros 论坛...
(我用单引号或反引号括起来的术语就是这样的术语......)


关于“循环”和“播放”的警告弹出窗口:
好吧,请阅读该弹出窗口上的消息,对我来说它看起来非常清晰且不言自明...
(嗯,除了里面丑陋的错字,当然……!)


EXTRACTSAVEAS 中获取#EANF#
=> 是的,正常,那是因为您使用 UL 元素作为“相对定位”的“锚点”,在这种情况下您需要使用“双重相对定位”,因为 UL 元素实际上是“容器” ' 对于所有 LI + A 元素...
(更多解释on the Forum,我已经多次解释了概念/技术......)
嗯,链接好像失效了……,链接在这里:
https://forum.imacros.net/search.php?keywords=Double+Relative+Positioning


列表项的数量可以不同所以我不能使用已知迭代次数的循环...
(强调我的...)

嗯,嗯...,这不是真的,这实际上是我认为“最简单”的实现...,因为这将具有您可以让SAVEAS 负责保存的优势每个循环的单独/新行上的每个链接,(或者您需要为该功能添加/实现自己的机制......),如果元素是“未找到”,比如没有新的链接可提取...
...我将为此部分使用 2 种不同的机制...

(在iMacros for FF v8.8.2, PM v26.3.3, Win10_PRO_x64_21H1 中编写和测试的所有脚本。)


实现 1:在 Not Found 上循环 + 中止:

这会让stg像:

VERSION BUILD=8820413 RECORDER=FX
TAB T=1

SET Search_Keyword "Estate Agents"

'Debug:
'SET !LOOP 15

'URL GOTO=https://www.home.co.uk/search/agents/?county=beds

'Extract Links using 'Relative Positioning':
'TAG POS=1 TYPE=H1 ATTR=TXT:Estate<SP>Agents<SP>in<SP>Bedfordshire  //  (Recorded)
TAG POS=1 TYPE=H1 ATTR=TXT:{{Search_Keyword}}<SP>in<SP>*
TAG POS=R{{!LOOP}} TYPE=A ATTR=TXT:{{Search_Keyword}}<SP>in<SP>* EXTRACT=HREF
'>
'Debug:
'PROMPT {{!EXTRACT}}

'Save Link to '.CSV' (or '.TXT'):
SAVEAS TYPE=EXTRACT FOLDER=* FILE=c:\Development\towns.txt
'SAVEAS TYPE=EXTRACT FOLDER=* FILE=SOF_MSB.txt

'Abort Script if no more Link(s) to extract:
SET !TIMEOUT_STEP 1
TAG POS=R1 TYPE=LI ATTR=TXT:{{Search_Keyword}}<SP>in<SP>*

是的,好的,这个已经可以了...
页面上有 21 个提供 URL 的链接,我将脚本循环了 30 次,它在 Loop=21 结尾自行中止...!

  • 注意,我不使用 !ERRORIGNORE,而 Abort Func 实际上依赖于它...
  • 在“链接”(A 元素)上提取和循环时,我“切换回”到第二个 R-POSLI 元素以中止脚本,就好像我还使用了下一个链接,EXTRACT 命令永远不会中止脚本(按设计),如果找不到元素,它将简单地返回#EANF#,如果没有EXTRACT,脚本将单击并按照所有先前的链接循环。
  • 循环脚本时可以省略!EXTRACT_TEST_POPUP...
  • 在已经“手动”加载一次的页面上“最好”工作,或者在每个循环中重新加载页面会减慢执行速度...如果“确实”需要从脚本加载页面,可以添加一个“条件 URL GOTO”机制(另一种“概念/技术”,用于在 iMacros 论坛中搜索,啊-啊...!),仅用于加载页面 Loop=1...

实现 2:循环 + 中止 MacroError() + 报告:

好吧...,这将是我的“最爱”...!:
与 Script_1 相同,但可以应用于 A 元素以中止脚本并使用 MacroError() 允许在 iMacros 侧面板中显示一些迷你报告,例如:

VERSION BUILD=8820413 RECORDER=FX
TAB T=1

SET Search_Keyword "Estate Agents"

'Debug:
'SET !LOOP 15

'URL GOTO=https://www.home.co.uk/search/agents/?county=beds

'Extract Links using 'Relative Positioning':
'TAG POS=1 TYPE=H1 ATTR=TXT:Estate<SP>Agents<SP>in<SP>Bedfordshire  //  (Recorded)
TAG POS=1 TYPE=H1 ATTR=TXT:{{Search_Keyword}}<SP>in<SP>* EXTRACT=TXT
SET Title {{!EXTRACT}}
SET !EXTRACT NULL
TAG POS=R{{!LOOP}} TYPE=A ATTR=TXT:{{Search_Keyword}}<SP>in<SP>* EXTRACT=HREF
'>
'Debug:
'PROMPT {{!EXTRACT}}

'Save Link to '.CSV' (or '.TXT'):
'SAVEAS TYPE=EXTRACT FOLDER=* FILE=c:\Development\towns.txt
SAVEAS TYPE=EXTRACT FOLDER=* FILE=SOF_MSB.txt

'Abort Script if no more Link(s) to extract:
SET !TIMEOUT_STEP 1
SET !EXTRACT NULL
'TAG POS=R1 TYPE=LI ATTR=TXT:{{Search_Keyword}}<SP>in<SP>*
TAG POS=R1 TYPE=A ATTR=TXT:{{Search_Keyword}}<SP>in<SP>* EXTRACT=TXT

'Prepare mini-Report:
SET Report {{!LOOP}}<SP>Links<SP>extracted<SP>for:<BR>{{Title}}
SET Summary (No<SP>Error...!!)<SP>({{!NOW:yyyy-mm-dd<SP>hhhnn}})<BR><BR>{{Report}}<BR><BR>

SET !ERRORIGNORE NO
SET Abort_Report EVAL("var s='{{!EXTRACT}}'; if(s=='#EANF#'){MacroError(\"{{Summary}}\");}")
SET !ERRORIGNORE YES

像 Script_1,=> 循环 30 或 50 次,会显示:

MacroError: (No Error...!!) (2021-07-22 15h57)

21 Links extracted for:
Estate Agents in Bedfordshire

, line 36 (Error code: -1340)

(小报告的内容当然可以自定义...,也可以保存到一些单独的'.log'文件...)


实现3:从包含UL元素中提取所有LI元素,其中有1个EXTRACT

这是一个“又快又脏”的演示,因为我觉得它的实现有点繁琐,但是你可以...:

VERSION BUILD=8820413 RECORDER=FX
TAB T=1

SET Search_Keyword "Estate Agents"

URL GOTO=https://www.home.co.uk/search/agents/?county=beds

'TAG POS=1 TYPE=LI ATTR=TXT:Estate<SP>Agents<SP>in<SP>Ampthill
'TAG POS=1 TYPE=LI ATTR=TXT:Estate<SP>Agents<SP>in<SP>Barton-Le-Clay
'TAG POS=1 TYPE=DIV ATTR=TXT:Estate<SP>agent<SP>listings<SP>are<SP>available<SP>for<SP>th* EXTRACT=HTM

'TAG POS=1 TYPE=P ATTR=TXT:Estate<SP>agent<SP>listings<SP>are<SP>available*
'TAG POS=R1 TYPE=UL ATTR=* EXTRACT=HTM

'Hum, can better use the 'H1' Element as Anchor...:
'TAG POS=1 TYPE=H1 ATTR=TXT:Estate<SP>Agents<SP>in<SP>Bedfordshire  //  (Recorded)
TAG POS=1 TYPE=H1 ATTR=TXT:{{Search_Keyword}}<SP>in<SP>*
TAG POS=R1 TYPE=UL ATTR=* EXTRACT=HTM

SET Results_HREF EVAL("var s='{{!EXTRACT}}'; var w,x,y,z; w=s.split('regular\">')[1]; x=w.split('\"'); y=x[1]+','+x[3]+','+x[5]; z=y.split(',').join('\\r\\n'); z;")
'>
'Debug:
PROMPT Results:<BR><BR>_{{Results_HREF}}_

'Not really finished... (Quick and dirty Demo...)

'Save Links to '.CSV' (or '.TXT':
'SAVEAS TYPE=EXTRACT FOLDER=* FILE=c:\Development\towns.txt

'>>>

'Extracted:
'<ul style="outline: 1px solid blue;" class="bullet-list columns-2 columns--regular"> 
'<li style="outline: 1px solid blue;"><a href="/search/agents/results.htm?location=ampthill">Estate Agents in Ampthill</a></li> 
'<li style="outline: 1px solid blue;"><a href="/search/agents/results.htm?location=barton_le_clay">Estate Agents in Barton-Le-Clay</a></li> 
'<li><a href="/search/agents/results.htm?location=bedford">Estate Agents in Bedford</a></li> 
'<li><a href="/search/agents/results.htm?location=biggleswade">Estate Agents in Biggleswade</a></li> 
'<li><a href="/search/agents/results.htm?location=bromham">Estate Agents in Bromham</a></li> 
'<li><a href="/search/agents/results.htm?location=clapham_beds">Estate Agents in Clapham</a></li> <li><a href="/search/agents/results.htm?location=dunstable">Estate Agents in Dunstable</a></li> <li><a href="/search/agents/results.htm?location=flitwick">Estate Agents in Flitwick</a></li> <li><a href="/search/agents/results.htm?location=harlington">Estate Agents in Harlington</a></li> <li><a href="/search/agents/results.htm?location=henlow">Estate Agents in Henlow</a></li> <li><a href="/search/agents/results.htm?location=houghton_regis">Estate Agents in Houghton Regis</a></li> <li><a href="/search/agents/results.htm?location=kempston">Estate Agents in Kempston</a></li> <li><a href="/search/agents/results.htm?location=langford">Estate Agents in Langford</a></li> <li><a href="/search/agents/results.htm?location=leighton_buzzard">Estate Agents in Leighton Buzzard</a></li> <li><a href="/search/agents/results.htm?location=linslade">Estate Agents in Linslade</a></li> <li><a href="/search/agents/results.htm?location=luton">Estate Agents in Luton</a></li> <li><a href="/search/agents/results.htm?location=potton">Estate Agents in Potton</a></li> <li><a href="/search/agents/results.htm?location=sandy">Estate Agents in Sandy</a></li> <li><a href="/search/agents/results.htm?location=shefford">Estate Agents in Shefford</a></li> <li><a href="/search/agents/results.htm?location=stotfold">Estate Agents in Stotfold</a></li> 
'<li><a href="/search/agents/results.htm?location=toddington">Estate Agents in Toddington</a></li> </ul>

关于脚本,这是一个“快速而肮脏”的解决方案,关于 y 部分,仅演示前 3 个链接...
更整洁的方法是使用for 循环直到x.length/2 (Incr=2) 和Array.push(),但这只是一个快速而肮脏的演示,其中重新创建y 字符串/数组需要“困难” -coded” 30 或 50 次...

=> 查看调试内容PROMPT...

(并且脚本只需要运行 x1 次,=> 使用“播放”按钮,而不是使用“循环”按钮。)

嗯,我应该提一下,对于这个实现,实际上是“推荐”“新鲜”加载(或重新加载)页面(=> 带有我在这个脚本中(重新)激活的URL GOTO),并且当然不要在“该”脚本运行之前在该页面上“玩” iMacros,或者 iMacros(录制或重播)将在页面的 HTML 结构中注入一些样式,=> 就像在我的“提取:”部分中可见style="outline: 1px solid blue;" 用于 UL 元素和前 2 个 LI 元素...
“问题”是这个style extra-Attribute 每次都包含(2)个双引号,但我实际上基于这个非常双引号字符(")中的split() 之一来隔离HREF 值或 x[1]/x[3]/x[5]/etc 将从数组中转移到 (Start)Index 的更高值...并且增量也将一起更改...


【讨论】:

  • 好吧,答案现在已经完成了......,即使我没有在第三次实现上花费“太多时间”,因为我觉得它有点麻烦......,@OP 仍然没有'没有跟进...
  • 哇 - 刚刚登录 - 感谢所有贡献,我开始测试回复并理解这一点。
  • 这是我多年来看到的一个问题的最佳回复帖子之一 - 抱歉迟到了 - 我们离开了几天。非常感谢 chivracq 和其他所有人的所有投入。
  • 糟糕,删除 + 重新发布,因为我无法编辑/更正错字... // 好的,感谢 @MSB 的跟进/反馈并接受答案...只是好奇...:在 Script_[1_2_3] ...之间,您选择了 3 个实现中的哪一个?我提到 Script_2 是我的“最爱”,但这有点“个人”意见,Implementation_1 有点依赖“技巧”,以及您网站上的 LI 元素不是“可点击”的“运气” ... Implementation_2 会更“通用”,应该适用于所有/大多数网站... +“迷你报告”技术非常有用,我认为...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多