awk只处理第一行输入文件?从HTML元素中提取属性值

时间:2014-07-21 22:29:58

标签: string awk string-parsing command-line-interface html-content-extraction

我有一个填充HTML属性的巨大文本文件。我只想要标签的价值。 例如:

<option value="API" datatype="string" datatype_value="0">API</option>
<option value="Account" datatype="string" datatype_value="0">Account</option>
<option value="Address - asn" datatype="string" datatype_value="0">Address - asn</option>

我只想在“期权价值”之后使用“API”。

现在我有这个:

awk -F "option value=" '{print $2}' /inputFilePath | awk '{print $1}'

我可以在文件的第一行使用 ONLY 。所以当我在文件上面运行上面的命令时,我的输出只返回:

"API"

而不是“帐户”,“地址”或之后的任何内容。

对任何我可能做错的事情都有任何想法?提前谢谢!

4 个答案:

答案 0 :(得分:2)

改为修改RS:

awk 'BEGIN { RS = "<option value=\"" ; FS = "\""; } NF { print $1 }' file

输出:

API
Account
Address - asn

我希望它适用于awk作为nawk没有。

又一个使用GNU awk:

gawk '{ t = $0; while (match(t, /<option value="([^"]*)"(.*)/, a)) { print a[1]; t = a[2] } }' file

我明确地使用了[^"]*,因为我发现空值仍然适用于您的查询,但如果愿意,您可以将其更改为[^"]+

答案 1 :(得分:0)

症状表明可能是您的<option>元素位于行,而不是拥有上的每个元素。

更新:迄今为止,OP尚未提供有关原始问题的反馈意见,但考虑到无论单行是否包含已接受的答案多个元素或只是一个,上面的猜测很可能 (这个答案最初包含一个次优的sed解决方案,前两个评论引用 - 我已将其删除。) 功能

如果您可以使用GNU awkmawk,那么 accepted answer是解决特定问题的绝佳解决方案

通常,但是,最好使用专用的HTML / XML解析CLI - 它真正了解数据结构并提供更强大的功能灵活的数据提取方式

例如,使用多平台网络抓取CLI xidel,解决方案将简化为:

xidel -q -e '//option/@value' file
  • //option/@value是一个XPath查询,用于选择跨DOM所有级别的所有value元素的option属性(根据需要更具体)。
  • 默认情况下,xidel仅提取匹配节点的内容,并在单独的行上打印。
  • 作为一个HTML解析器,xidel无论非重要空白的变化如何都能正确地解析HTML - 感兴趣的元素分散到多少行并不重要。

答案 2 :(得分:0)

这适用于所有awk

awk -F"<option value=" '{split($2,a,"\"");print a[2]}' file
API
Account
Address - asn

如果您需要双引号:

awk -F"<option value=" '{split($2,a,"\"");print "\""a[2]"\""}' file
"API"
"Account"
"Address - asn"

答案 3 :(得分:-1)

添加到您的示例代码$ 1~ / API /。

awk -F "option value=" '{print $2}' /inputFilePath | awk '$1 ~ /API/ {print $1}'