使用sed或grep在HTML标记之间提取文本

时间:2017-07-09 10:04:03

标签: html bash sed grep

我遇到了问题。我想用sed或grep命令获取这个html的两个部分。我怎样才能提取它们?

的test.html:

<html>
 <body>
  <div id="foo" class="foo">
   Some Text.
    <p id="author" class="author">
     <br>
     <a href="example.com">bar</a>
    </p>
  </div>
 </body>
</html>

script.sh

#!/bin/bash

author=$(sed 's/.*<p id="author" class="author"><br><a href="*">\(.*\)<\/a><\/p>.*/\1/p' test.html)
quote=$(sed 's/.*<div id="foo" class="foo">\(.*\)<\/div>.*/\1/p' test.html)

在我只想要值中的文本的行下面。没有html标签。 但我的剧本有效。

4 个答案:

答案 0 :(得分:1)

代码:

text="$(sed 's:^ *::g' < test.html | tr -d \\n)"
author=$(sed 's:.*<p id="author" class="author"><br><a href="[^"]*">\([^<]*\)<.*:\1:' <<<"$text")
quote=$(sed 's:.*<div id="foo" class="foo">\([^<]*\)<.*:\1:' <<<"$text")
echo "'$author' '$quote'"

工作原理:

  1. $text被指定为test.html的无缩进单行表示形式;请注意:用作sed的分隔符而不是/,因为任何字符都可以作为分隔符,我们正在解析的文本有/ - s现在,所以我们不必在构建正则表达式时用\ - s来逃避它们。
  2. $author假设在<p id="author" class="author"><br><a href="[^"]*">之间(其中[^"]*表示«除"以外的任何字符,重复N次,N∈[0,+∞)»)以及接下来的任何标签。
  3. 假设
  4. $quote介于<div id="foo" class="foo">和下一个标记之间。
  5. 相当模糊的构造<<<"$text"就是所谓的here-string,几乎等同于echo "$text" |放在开头。

答案 1 :(得分:0)

您可以使用xmllint来解析html / xml文本并提取定义的xpath的值。

以下是工作示例:

#!/bin/bash

author=$(xmllint --html --xpath '//div[@class="foo"]/text()' test.html | tr -d '\n' | sed -e "s/ //g")
quote=$(xmllint --html --xpath '//a/text()' test.html | sed -e "s/ //g")
echo "Author:'$author'"
echo "Quote:'$quote'"
  • xpath 定义需要从中提取文本的xml节点路径。
  • tr 用于删除换行符。
  • sed 用于修剪提取的文字值中的字符串。

答案 2 :(得分:0)

您可以使用html2text

# cat test.html | html2text
Some Text.


[bar](example.com)

我经常使用 curl

# curl -s http://www.example.com/ | html2text

# Example Domain

This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.

[More information...](https://www.iana.org/domains/example)

#

答案 3 :(得分:0)

don't use regex to parse HTML/XML,但请改用像 这样的专用解析器:

$ xidel -s test.html -e '//p/a,//div/normalize-space(text())'
bar
Some Text.
$ eval $(xidel test.html -se 'author:=//p/a,quote:=//div/normalize-space(text())' --output-format=bash)

$ printf '%s\n' "$author" "$quote"
bar
Some Text.