3

ダイナミックHTMLテーブルから特定の値を取得するBASH/Perlスクリプトを作成しようとしています。

これが私のページのサンプルです

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

<tr align = "center">

<th>環境</th><th>リリーストラック</th><th>アーティファクト</th><th>名前</th><th>ビルド番号</th><th>証明書ID</th ><th>ビルドID</th><th>リクエストステータス</th><th>更新時間</th><th>ログ情報</th><th>イニシエーター</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>2013年3月18日午後3時10分58秒</td><tdwidth="70">ログ情報</ 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>2013年3月18日14:32:27</td> <tdwidth="70">ログ情報</a></ td> <td> CESAR </ td>

</ tr>

</ table>

私の目標は、このセルからこの値を取得することです。

「配備済み」

それを見る別の方法...

[リクエストステータス]列のすべてのデータを取得します

「Deployed」の値は動的であり、変更される可能性があります。

私は以下を試しました:

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

を使用xmllintすると、xpathに基づいて要素を抽出できます。

例えば:

$ 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

XML :: LibXMLのラッパーであるxshを試すことができます:

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 に答える
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 に答える
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 に答える