3

我正在尝试创建一个 BASH/Perl 脚本,该脚本将从动态 html 表中获取特定值。

这是我的页面示例

<table border="1" bordercolor="#FFCC00" style="background-color:#FFFFCC" width="100%" cellpadding="3" cellspacing="3">

<tr 对齐=“中心”>

<th>环境</th><th>发布轨道</th><th>工件</th><th>名称</th><th>版本号</th><th>Cert Idn</th ><th>Build Idn</th><th>请求状态</th><th>更新时间</th><th>日志信息。</th><th>Initiator</th>

</tr>

<tr>
<td>DEV03</td><td>2.1.0</td><td>abpa</td><td>ecom-abpa-ear</td><td>204</td><td>82113 </td><td>171242</td><td>已部署</td><td>3/18/2013 3:10:58 PM</td><td width="70">日志信息</td> a></td><td>CESAR</td>
</tr>

<tr>
<td>DEV03</td><td>2.1.0</td><td>abpa</td><td>abpa_dynamic_config_properties</td><td>20</td><td>82113</td> <td>167598</td><td>已部署</td><td>3/18/2013 2:32:27 PM</td><td width="70">日志信息</a></ td><td>CESAR</td>

</tr>

</table>

我的目标是从这个单元格中获取这个值。

“部署”

另一种看待它的方式......

检索“请求状态”列下的所有数据

“已部署”的值是动态的并且可以更改。

我尝试了以下方法:

sed -e 's/>/>\n/g' abpa_cesar_status.txt | egrep -i "^\s*[A-Z]+&lt;/td&gt;
" | sed -e 's|&lt;/td&gt;||g' | grep Deployed

但这仅适用于“已部署”

有任何想法吗?

4

5 回答 5

3

您应该使用解析器xmllint来执行此操作。

您可以根据xmllintxpath 提取元素。

例如:

$ xmllint --html --format --shell file.html <<< "cat //table/tr/td[position()=8]/text()"
/ >  -------
Deployed
 -------
Deployed
/ >

上面命令中的 xpath//table/tr/td[position()=8]/text()会返回第 8 列中的值。

于 2013-03-19T16:46:34.373 回答
3

您也可以使用我的Xidel来获取第 8 列中的所有内容:

xidel your_table.html -e '//table//tr/td[8]'

或者如果列位置也可以改变,先获取列号:

xidel your_table.html -e 'column:=count(//table//th[.="Request Status"]/preceding-sibling::*)+1' -e '//table//tr/td[$column]'
于 2013-03-19T17:24:02.063 回答
2

请注意,您的文档输出格式不正确(缺少一些开头<a>),是正常/预期还是错字?否则,这是一个格式良好的版本

命令

我喜欢xmlstarlet,简单直接的 XPath 用于简短的测试:

xmlstarlet sel -t -m "//table/tr/td[position()=8]" -v "./text()" -n 

解释

sel   (or select)        - Select data (mode) or query XML document(s) (XPATH, etc)
-t or --template         - start a template
-m or --match <xpath>    - match XPATH expression
-v or --value-of <xpath> - print value of XPATH expression
-n or --nl               - print new line

输出

Deployed
Deployed
# plus empty-cell
于 2013-03-19T17:32:35.857 回答
2

您可以尝试xsh ,它是XML::LibXML的包装器:

open :F html abpa_cesar_status.txt ;
$status = count(//table/tr[1]/th[.="Request Status"]/preceding-sibling::th) ;
ls //td[count(preceding-sibling::td)=$status] ;

为了使用它,您必须使您的 html 格式更好一些(我必须删除</a>才能使脚本正常工作)。

于 2013-03-19T17:07:21.997 回答
0

又快又脏:

cat your_html_file | perl -pe "s/^<\/?table.*$//g;s/^<tr .*$//g;s/<tr> (<td>.*?){8}//g;s/<th.*$//g;s/<\/.*$//g" | sed '/^$/d'

但是,这不是您应该这样做的方式。使用现有的(Perl?)软件来解析 html 并提取您的价值。

编辑:由于您更改了代码(添加了空格),因此这不再起作用。QED。

于 2013-03-19T16:46:54.393 回答