1

この Web ページから XPATH //DIV[@id="ps-content"] を抽出したいと思います: http://www.amazon.com/dp/1449319432 (ローカル ファイルとして保存)

BaseX や Saxon-PE などの最高のパーサーの 1 つを使用して、1 行のコマンドラインでそれを実行したいと考えています。

これまでのところ、私が(持っていると思われる)見つけた最短の解決策は、次の2行です。

java -jar tagsoup-1.2.1.jar <page.html >page.xhtml"
basex -ipage.xhtml "//DIV[@id='ps-content']"

しかし、それが返すものはすべて、予想されるhtmlコードのブロックではなく、空の行です:

私の質問は2つあります:

4

2 に答える 2

1

クエリには 2 つの問題があります。

  1. Tagsoup は名前空間を追加します

    名前空間を登録します (おそらく XHTML しか扱っていないため、デフォルトの名前空間を宣言するのが合理的です)。

    basex -ipage.xhtml "declare default element namespace 'http://www.w3.org/1999/xhtml'; //div[@id='ps-content']"
    

    または*、各要素の名前空間インジケーターとして使用します。

    basex -ipage.xhtml "//*:div[@id='ps-content']"
    
  2. XML/XQuery は大文字と小文字を区別します

    (1) のクエリで既に修正しました:<div/>は と同じではありません<DIV/>。(1)の両方のクエリは、すでに期待される結果をもたらしています。


Tagsoup は BaseX 内から使用できます。HTML 入力用に個別に呼び出す必要はありません。デフォルトのJavaクラスパスにtagsoupを必ず含めてください。libtagsoup-javaDebianにインストールする。

basex 'declare option db:parser "html"; doc("page.html")//*:div[@id="ps-content"]'

次のような場合は、BaseX から直接 HTML ページをクエリすることもできます。

basex 'declare option db:parser "html"; doc("http://www.amazon.com/dp/1449319432")//*:div[@id="ps-content"]'

tagsoup を使用-iしてもうまくいきませんでしたが、doc(...)代わりに使用できます。

于 2013-06-09T21:55:45.803 に答える
0

私はついに正しいコマンドラインを見つけました:

basex "declare option db:parser 'html'; doc('page.html')//*:div[@id='ps-content']"

注: このように引用符の種類を反転すると、私の Win7 では機能しません:

basex 'declare option db:parser "html"; doc("page.html")//*:div[@id="ps-content"]'
于 2013-06-11T11:05:22.917 に答える