【问题标题】:How can I extract URLs from JSON data?如何从 JSON 数据中提取 URL?
【发布时间】:2010-10-10 09:16:49
【问题描述】:

我有一个文本文档,我想从中提取 URL 并将它们放入一个新的文本文件中。我怎样才能在 Perl 中做到这一点?文本文件的示例在这里:

{"type":"TabGroupsManager:GroupData","id":65,"name":"XML 架构 编辑器","图片":"http://www.altova.com/favicon.ico","disableAutoRename":false,"titleList":"XML 架构编辑器\u000aAltova XMLSpy 代码 一代\u000a在线视频 演示\u000a计划的数据交换 案例研究\u000aXML 编辑器\u000aAltova XMLSpy 2011\u000aXML 模式管理 工具\u000a","tabs":["{\"entries\":[{\"url\":\"http://www.altova.com/xmlspy/xml-schema-editor.html\", \"标题\":\"XML 架构 Editor\",\"ID\":1442422751,\"referrer\":\"http://www.altova.com/xmlspy/xml-editing.html\",\"scroll\":\"0, 0\",\"formdata\":{\"#q\":\"\"}}],\"index\":1,\"attributes\":{\"image\":\"http ://www.altova.com/favicon.ico\"},\"extData\":{\"TabGroupsManagerGroupId\":\"65\",\"TabGroupsManagerGroupName\":\"XML 架构 编辑器\"},\"_formDataSaved\":true}","{\"entries\":[{\"url\":\"http://www.altova.com/xmlspy/xml-code-generation .html\",\"标题\":\"Altova XMLSpy 代码 Generation\",\"ID\":1442423118,\"referrer\":\"http://www.google.com/search?hl=en&client=firefox-a&hs=GR1&rls=org.mozilla%3Aen-GB% 3Aofficial&q=altova+derive+schema+from+xml&aq=f&aqi=m1&aql=&oq=&gs_rfai=\",\"scroll\":\"0,0\",\"formdata\":{\"#q\" :\"\"}}],\"index\":1,\"属性\":{\"image\":\"http://www.altova.com/favicon.ico\"},\ "extData\":{\"TabGroupsManagerGroupId\":\"65\",\"TabGroupsManagerGroupName\":\"XML 架构 编辑器\"},\"_formDataSaved\":true}","{\"entries\":[{\"url\":\"http://www.altova.com/videos.asp?type=0&video =xmlspy\",\"标题\":\"在线 视频 Demos\",\"ID\":1442423184,\"referrer\":\"http://www.altova.com/xmlspy/xml-code-generation.html\",\"scroll\":\" 0,0\",\"formdata\":{\"#q\":\"\"}}],\"index\":1,\"attributes\":{\"image\":\ "http://www.altova.com/favicon.ico\"},\"extData\":{\"TabGroupsManagerGroupId\":\"65\",\"TabGroupsManagerGroupName\":\"XML 架构 编辑器\"},\"_formDataSaved\":true}","{\"entries\":[{\"url\":\"http://www.altova.com/solutions/exchange_ratecasestudy.html\" ,\"标题\":\"预定 数据交换案例 研究\",\"ID\":2618,\"formdata\":{\"#q\":\"\"},\"scroll\":\"0,1369\"}],\" index\":1,\"attributes\":{\"image\":\"http://www.altova.com/favicon.ico\"},\"extData\":{\"TabGroupsManagerGroupId\" :\"65\",\"TabGroupsManagerGroupName\":\"XML 架构 编辑器\"},\"_formDataSaved\":true}","{\"entries\":[{\"url\":\"http://www.altova.com/xml-editor/\", \"标题\":\"XML Editor\",\"ID\":2620,\"formdata\":{\"#q\":\"\"},\"scroll\":\"0,0\"}],\" index\":1,\"attributes\":{\"image\":\"http://www.altova.com/favicon.ico\"},\"extData\":{\"TabGroupsManagerGroupId\" :\"65\",\"TabGroupsManagerGroupName\":\"XML 架构 编辑器\"},\"_formDataSaved\":true}","{\"entries\":[{\"url\":\"http://manual.altova.com/XMLSpy/spystandard/index.html ?xmlschemasstd.htm\",\"标题\":\"Altova XML间谍 2011\",\"ID\":2622,\"children\":[{\"url\":\"http://manual.altova.com/XMLSpy/spystandard/xmlspy_content_dyn.html\",\"标题\":\"Altova XMLSpy 2011\",\"ID\":2623,\"referrer\":\"http://manual.altova.com/XMLSpy/spystandard/index.html?xmlschemasstd.htm\",\"scroll\": \"0,0\"},{\"url\":\"http://manual.altova.com/XMLSpy/spystandard/xmlschemasstd.htm\",\"title\":\"XML Schemas\",\"ID\":2624,\"referrer\":\"http://manual.altova.com/XMLSpy/spystandard/index.html?xmlschemasstd.htm\",\"scroll\": \"0,260\"}],\"scroll\":\"0,0\"}],\"index\":1,\"attributes\":{},\"extData\":{\" TabGroupsManagerGroupId\":\"65\",\"TabGroupsManagerGroupName\":\"XML 架构 编辑器\"},\"_formDataSaved\":true}","{\"entries\":[{\"url\":\"http://www.altova.com/schemaagent.html\",\ "标题\":\"XML 模式管理 工具\",\"ID\":2626,\"formdata\":{\"#q\":\"\"},\"scroll\":\"0,171\"}],\"index\ ":1,\"attributes\":{\"image\":\"http://www.altova.com/favicon.ico\"},\"extData\":{\"TabGroupsManagerGroupId\":\ "65\",\"TabGroupsManagerGroupName\":\"XML 架构 编辑器\"},\"_formDataSaved\":true}"]}

从中我想创建一个文本文件,例如:

http://www.altova.com/xmlspy/xml-schema-editor.html
http://www.altova.com/xmlspy/xml-code-generation.html

【问题讨论】:

  • 这是 JSON,您可以使用search.cpan.org提供的 perl JSON 模块
  • 任何通用的 URL 提取都应该使用模块 URI::Find

标签: perl json


【解决方案1】:

由于这似乎是 JSON 文件而不是纯文本文件,因此请使用 JSON modules on CPAN 之一。这有点复杂,因为您似乎将数据编码为 JSON,然后作为字符串存储在一个更大的对象中,然后该对象已转换为 JSON——因此您必须解析文件,提取字符串,将它们解析为 JSON转,然后从中提取 URI。

【讨论】:

  • 哦..非常感谢..我从机器崩溃中得到了一堆大日志文件,感谢那些可以阅读机器 txt 并说这是 json 的专家!!
  • @David..如果我引用的给定文本是 .txt 文件,你能告诉我解决方案的脚本吗?
【解决方案2】:

如果 Perl 不是必须的,

$ sed 's|\\||g' file| awk -vRS='"url":' -F"," '{print $1}' | grep -E "http|ftp"
"http://www.altova.com/xmlspy/xml-schema-editor.html"
"http://www.altova.com/xmlspy/xml-code-generation.html"
"http://www.altova.com/videos.asp?type=0&video=xmlspy"
"http://www.altova.com/solutions/exchange_ratecasestudy.html"
"http://www.altova.com/xml-editor/"
"http://manual.altova.com/XMLSpy/spystandard/index.html?xmlschemasstd.htm"
"http://manual.altova.com/XMLSpy/spystandard/xmlspy_content_dyn.html"
"http://manual.altova.com/XMLSpy/spystandard/xmlschemasstd.htm"
"http://www.altova.com/schemaagent.html"

【讨论】:

  • 在安装了 MSYS 的 Windows 机器上试过这个。遇到错误:'\\' 不是内部或外部命令、可运行程序或批处理文件。
  • windows上,把所有的单引号改成双引号,把awk里面的所有双引号转义,因为cmd.exe很烂
猜你喜欢
  • 1970-01-01
  • 2012-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2022-12-22
相关资源
最近更新 更多