如何从HTML文件中提取标签的属性值?

时间:2012-07-17 13:43:24

标签: regex bash

我知道,不要使用curl,grep和sed解析。但我正在寻找一种简单的方法,而不是一种非常安全的方法。

所以我得到一个带curl的HTML文件,我需要从标签中获取某个属性的值。我使用grep来告诉我token所在的行。这只发生一次。 这给了我一个完整的div:

<div class="userlinks">
  <span class="arrow flleft profilesettings">settings</span>
  <form class="logoutform" method="post" action="/logout">
    <input class="logoutbtn arrow flright" type="submit" value="Log out">
    <input type="hidden" name="ltoken" value="a5fc8828a42277538f1352cf9ea27a71">
  </form>
</div>

如何才能获得value属性(例如“a5fc8828a42277538f1352cf9ea27a71”)?

5 个答案:

答案 0 :(得分:10)

没有必要grep:

sed -n '/token/s/.*name="ltoken"\s\+value="\([^"]\+\).*/\1/p' input_file

答案 1 :(得分:8)

单向,使用sed

sed "s/.* value=\"\(.*\)\".*/\1/" file.txt

结果:

a5fc8828a42277538f1352cf9ea27a71

HTH

答案 2 :(得分:2)

使用XPath表达式和Grep的短划线

您实际上可以从命令行正确解析HTML。例如,您可以使用xgrep创建一个xpath表达式,然后使用GNU sed(或您选择的grep)来提取您关注的文本。例如:

$ xgrep -x '//input[@name="ltoken"][1]/@value' /tmp/foo |
      sed -rn '/value/ s/.*"([[:xdigit:]]+)"/\1/p'
a5fc8828a42277538f1352cf9ea27a71

答案 3 :(得分:2)

xgrep解决方案存在一个问题,即它需要有效的xml。由于未关闭的“输入”元素,提供的html无效。 xmllint有一个html解析器选项,并提供string()函数来提取值而不使用sed。

$ xmllint --html --xpath 'string(//input[@name="ltoken"][1]/@value)' foo
a5fc8828a42277538f1352cf9ea27a71

答案 4 :(得分:2)

使用awk

的另一种方法
grep "ltoken" file.txt | awk -F"\"" '{print $6}'

对于不同的属性值,只需增加或减少$6

的值