2

Web ページで xmlstarlet を使用しているときに、ほとんどの場合、エンティティ参照エラーに直面しました。これにより、Web ページからの抽出には役に立たなくなります。

HTMLページは整形式のXMLではないため(htmlも処理するオプションはありますか?)私はそれらを次のように変換します

tidy -asxhtml 

XHTMLに、きちんと宣言を入れます

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

次にxmlstarletで処理した後

curl http://www.xfree86.org/current/index.html |  tidy -asxhtml | \
  xmlstarlet sel --net -T   -t -m hr -v . -

それは常に同じエラーをスローします

-:13: parser error : Entity 'reg' not defined
<h1>Documentation for XFree86&reg; version 4.8.0</h1>

xmlsttarlet にエンティティ参照ファイルを知らせる方法を知っている人はいますか?

4

1 に答える 1

7

次のように、文字エンティティを数値エンティティに変換するように tidy に指示してみてください。

curl --silent -q http://www.xfree86.org/current/index.html | \
tidy -q -numeric -asxhtml --show-warnings no  | \
xmlstarlet sel -N xhtml="http://www.w3.org/1999/xhtml" -t -m "//xhtml:hr" -c . -n 2>/dev/null

ここで、次のオプションを追加しました。

  • curl に--silentandで黙らせるように指示する-q
  • tidy に静かにするよう伝え-q--show-warnings no
  • エンティティを数値のものに変換するように tidy に指示します。-numeric
  • xmlstarlet に XPath に使用する xhtml 名前空間を指定し、xhtml という名前を-N付けます。
  • XPath をhr名前空間の に一致するように変更しますxhtml

これにより、エンティティが定義されていないというエラーが解消され、前のコマンドがすべてサイレントになり、必要な要素が選択されます。

ただし、xmlstarlet v1.0.6 でこれを実行しようとすると、次のようになります。

Entity: line 1: parser warning : xmlParsePITarget: invalid name prefix 'xml'
<?xmlstarlet version="1.0"?>

これが本当に問題かどうかはわかりませんが、無視しても安全な警告のように思えます...したがって、 stderr を /dev/null に出力するだけです2>/dev/null

于 2011-04-05T00:25:15.430 に答える