我有以下HTML代码:
<textarea name="command" class="setting-input fixed-width" rows="9">1</textarea><textarea name="command" class="setting-input fixed-width" rows="5">2</textarea>我想解析它以接收这样的输出:
1
2目前我正在使用:
xmllint --xpath '//textarea[@name="command"]/text()' --html但是它不会在每一场比赛之后追加换行符。
发布于 2018-01-17 23:15:26
你好,来自2020年!
在libxml的2.9.9版本中,这个行为是本身。
但是,如果您使用的是更老的方法,并且不希望仅仅为了获得固定的xmllint而从源代码构建libxml,那么这里需要其他解决方案之一。例如,在撰写本文时,最新的CentOS 8仍然在使用libxml (2.9.7)的版本,该版本的行为方式与OP描述的一样。
正如我从这就是答案中收集到的,理论上可以将一个命令传递到旧版本(<2.9.9)版本的xmllint的--shell选项中,这将在单独的行上生成每个节点。但是,您最终不得不使用sed或grep对其进行后期处理,以删除shell模式(面向人的)输出的视觉碎片。不太理想。
如果可用的话,XMLStarlet提供了另一种解决方案,但在使用xmlstarlet sel提取节点之前,您确实需要使用xmlstarlet fo将您的HTML片段格式化为有效的xmlstarlet sel:
echo '
<textarea name="command" class="setting-input fixed-width"
rows="9">1</textarea>
<textarea name="command" class="setting-input fixed-width"
rows="5">2</textarea>' \
| xmlstarlet fo -H -R \
| xmlstarlet sel -T -t -v '//textarea[@name="command"]' -n如果来自第二次Attempt to load network entity调用的xmlstarlet消息使您感到烦恼,那么只需在结束时添加2>/dev/null来抑制它(冒着抑制其他打印到标准错误的消息的风险)。
解释了XMLStarlet选项(另请参阅用户指南):
fo -H -R -rmat输出,期望输入,并恢复尽可能多的错误输入<html>根节点,使OP示例中的片段有效
sel -T -t -v //xpath -n -sel的XPath //xpath 节点-T)而不是XML-t)返回节点的值(-v),而不是节点本身(允许在XPath表达式中放弃使用text() )-n)
编辑:删除半实现的xmllint --shell解决方案,因为它是坏的。添加了一个实际适用于OP数据的XMLStarlet示例。
发布于 2018-07-30 14:41:12
试试这个补丁,它提供了两个选项:
--xpath:与旧--xpath相同,节点由\n分隔。--xpath0:与旧--xpath相同,节点由\0分隔。测试输入(a.html):
<textarea name="command" class="setting-input fixed-width" rows="9">1</textarea><textarea name="command" class="setting-input fixed-width" rows="5">2</textarea>测试命令1:
# xmllint --xpath '//textarea[@name="command"]/text()' --html a.html测试输出1:
1
2测试命令2:
# xmllint --xpath0 '//textarea[@name="command"]/text()' --html a.html | xargs -0 -n1测试输出2:
1
2发布于 2013-08-30 13:05:46
我做了以下,丑陋的把戏,请随时提供一个更好的解决方案。
使用以下命令将</textarea>替换为\n</textarea>,从而更改了HTML代码:
sed 's/\<\/textarea/\'$'\n\<\\/textarea/g' fhttps://stackoverflow.com/questions/18532948
复制相似问题