【问题标题】:Extracting URLs from an Emacs buffer?从 Emacs 缓冲区中提取 URL?
【发布时间】:2009-10-29 07:58:01
【问题描述】:

【问题讨论】:

    标签: elisp


    【解决方案1】:

    我采用了 Heinzi 的解决方案,并提出了我需要的最终解决方案。我现在可以获取文件列表,提取所有 URL 和标题,并将结果放在一个输出缓冲区中。

    (defun extract-urls (fname) “提取 HTML href url,标题以缓冲 'new-urls.csv' 以 | 分隔格式。” (setq in-buf (set-buffer (find-file fname)));保存以进行清理 (缓冲区开始);如果缓冲区已经打开,需要这样做 (setq u1 '()) (尽管 (重新搜索-转发 "^.*]+>\\([^" 无 t) (when (match-string 0) ; 得到一个匹配 (setq url (match-string 1) ) ;网址 (setq 标题 (匹配字符串 2) ) ;标题 (setq u1 (cons (concat url "|" title "\n") u1)) ;构建 URL 列表 ) ) (kill-buffer in-buf) ;不要留下一堆乱七八糟的缓冲区 (预测 (with-current-buffer (get-buffer-create "new-urls.csv"); 将结果发送到新缓冲区 (地图车'插入u1)) (切换到缓冲区“new-urls.csv”);最后,显示新缓冲区 ) ) ;;创建要处理的文件列表 ;; (地图车'提取网址'( “/tmp/foo.html” “/tmp/bar.html” ))

    【讨论】:

    • 很高兴看到您的 lisp 技能与我的正则表达式相结合。感谢分享最终解决方案。
    【解决方案2】:

    如果每行最多有一个链接,并且您不介意一些非常丑陋的正则表达式黑客攻击,请在缓冲区上运行以下代码:

    (defun getlinks ()
      (beginning-of-buffer)
      (replace-regexp "^.*<a href=\"\\([^\"]+\\)\"[^>]+>\\([^<]+\\)</a>.*$" "LINK:\\1|\\2")
      (beginning-of-buffer)
      (replace-regexp "^\\([^L]\\|\\(L[^I]\\)\\|\\(LI[^N]\\)\\|\\(LIN[^K]\\)\\).*$" "")
      (beginning-of-buffer)
      (replace-regexp "
    +" "
    ")
      (beginning-of-buffer)
      (replace-regexp "^LINK:\\(.*\\)$" "\\1")
    )
    

    它将所有链接替换为 LINK:url|description,删除所有包含其他内容的行,删除空行,最后删除“LINK:”。

    详细的HOWTO:(1)通过将&lt;href替换为&lt;a href来纠正示例html文件中的错误,(2)将上述函数复制到Emacs中,(3)在最后的“)”之后点击C-x C-e加载函数,(4) 加载示例 HTML 文件,(5) 使用 M-: (getlinks) 执行函数。

    请注意,第三个替换正则表达式中的换行符很重要。不要缩进这两行。

    【讨论】:

      【解决方案3】:

      您可以使用'xml 库,使用解析器的示例位于here。要解析您的特定文件,请执行以下操作:

      (defun my-grab-html (file)
        (interactive "fHtml file: ")
        (let ((res (car (xml-parse-file file)))) ; 'car because xml-parse-file returns a list of nodes
          (mapc (lambda (n)
                  (when (consp n) ; don't operate on the whitespace, xml preserves whitespace
                    (let ((link (cdr (assq 'href (xml-node-attributes n)))))
                      (when link
                        (insert link)
                        (insert "|")
                        (insert (car (xml-node-children n))) ;# grab the text for the link
                        (insert "\n")))))
                (xml-node-children res))))
      

      这不会递归解析 HTML 来查找所有链接,但它应该让您开始朝着通用解决方案的方向前进。

      【讨论】:

        猜你喜欢
        • 2011-08-10
        • 2013-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 2011-10-12
        • 1970-01-01
        相关资源
        最近更新 更多