如何从HTML中将标题和列表项内容提取到以逗号分隔的列表中?

时间:2013-01-03 03:23:46

标签: html regex sed

我的正则表达式很遗憾,虽然我正在阅读“掌握正则表达式”并阅读一些在线教程我无处可去,所以希望如果有人能给我一个实际的例子来说明我的情况它将帮助我开始。

输入文件大致如下:

<html>
 <head>
  <title>My Title</title>
 </head>
<body>
 <p>Various random text...</p>
 <ul>
  <li>One</li>
  <li><a href="example.com">Two</a></li>
  <li>Three</li>
 </ul>
 <p>Various random text...</p>
 </body>
</html>

我的最终目标是输出:

My Title,One,<a href="example.com">Two</a>,Three

e.g。逗号分隔的值与标题和li标签的内容

第一步是尝试删除所有之前和包括标题,所以我决定使用sed(我在Windows上运行GNU sed版本4.2)我尝试如下:

确定我需要将“所有内容”(包括换行符)与标题标记匹配,并替换为无意义的内容:

将每个字符与一个点匹配,并将newlines / n匹配为一个类并使其重复*表示[。\ n] *后跟标题标记 没有替换

所以

type file.html | sed "s/[.\n]*<title>//"

但这不起作用,它只删除字符串标题,但不删除之前的内容。

我哪里错了?我想明白。

任何建议表示赞赏。提前谢谢。

2 个答案:

答案 0 :(得分:1)

使用sed(和tr,和sed ......):

sed -n -e '/<title>\|<li>/{s/^[ ]*<[^>]*>//;s/<[^>]*>[ ]*$//p}' input | \
    tr '\n' , | sed 's/,$/\n/'

使用单个sed表达式:

sed ':a;N;$!ba;s/\n//g;        # loop, read-in all file, remove newlines 
     s/.*<title>//;            # remove everything up to, including <title>
     s/title>.*<ul>/title>/;   # remove everything between </title> and <ul>
     s!</ul>.*!!;              # remove everything after </ul>, inclusive
     s!</li>\|</title>!,!g;    # substitute closing tags with commas
     s/<li>//g;                # remove <li> tags
     s/,[ ]*$//                # delete the trailing comma
     ' input

答案 1 :(得分:0)

Ruby解决方案

你可以通过各种方式做你想做的事,有些比别人更优雅。这是使用单个Ruby单行程序获得预期结果的快捷方式。

ruby -ne 'BEGIN { output = "" }
          output << $1 + ?, if %r{<(?:title|li)>(.*)</\1?}
          END { puts output.sub(/,$/, "") }' /tmp/foo.html

此脚本将以原始问题中描述的格式打印结果。例如,使用提供的示例文本打印:

My Title,One,<a href="example.com">Two</a>,Three