
(過度に単純化された)次のHTML文書があります。
<html>
<body>
<a href="...">...</a>
<a href="...">...</a>
<a href="...">...</a>
...
</body>
</html>
私が望むのは、行で区切られた出力からURLを抽出することです。 xmllintと入力してください。
$ xmllint --html --xpath //a/@href
href="..." href="..." href="..."
属性、名前を含む属性全体を取得し、スペースで区切って出力します。属性値を含む行のリストを取得するにはhref
?私は次の出力が欲しい:
...
...
...
各要素の属性...
のURLはどこにありますか?href
a
この出力形式を正しく指定するにはどうすればよいですか?
答え1
一方file.html
:
<html>
<body>
<a href="url1">link text 1</a>
<a href="url2">link text 2</a>
<a href="url3">link text 3</a>
...
</body>
</html>
Unixパイプを使用して既存のxmllint
出力を送信し、sed
次の結果を表示できます。
$ xmllint --html --xpath //a/@href input.html | sed 's/ href="\([^"]*\)"/\1\n/g'
url1
url2
url3
説明する
単独で使用すると、xmllint
次のような結果のみが得られます。
$ xmllint --html --xpath //a/@href input.html
href="url1" href="url2" href="url3"%
- 末尾は
%
末尾の改行文字がないことを意味します。
Unixシリーズシステムの利点の1つは、次のような利点を得ることができることです。ダグ・マキロイのパイプ機能があるため、1つのプログラムですべての作業を行う必要はありません。実際に必要に応じてプログラムを組み合わせることをお勧めします。
したがって、見つかった出力は満足のいくものではなく、パイプを介してxmllint
コマンドとsed
結合します。
- 検索
href="URL"
単位 \(
\)
グループでURL部分を囲みます。\1\n
URL の周りで定義したグループを参照するように置き換え、一致の後に新しい行を追加します。\1
このように合計を結合して、目的の行に分割された出力(1行に1つのURL)を取得しますxmllint
。sed
答え2
sedの使用を検討しましたか?
sed -n 's/.*href="\([^"]*\).*/\1/p'