タグ

htmlとxpathに関するkitsのブックマーク (5)

  • Firefox 3.6 での XPath による要素取得: Days on the Moon

    Firefox 3.6 にしたら、動的に生成した文書からの XPath による要素取得ができなくなったという報告が挙がっています。 Firefox3.6でdirect_bookmark.jsとdirect_hb.jsのはてブのタグを取得できていない問題(未解決→解決) - ヴィンペラートル・オクタウィアヌス - vimperatorグループ subscldr.jsが動かなくなったのを直してみた - mountain_dewの日記 この原因は、Firefox 3.6 で HTML 要素の名前空間の扱いが変わったことにあります。Firefox 3.6 (Gecko 1.9.2) では、HTML5 に従い、HTML 要素が (XML 文書中でなくても) XHTML の名前空間 (HTML5 でいうところの「HTML の名前空間」) http://www.w3.org/1999/xhtml に属す

  • HTML と XHTML で同じ XPath を使う: Days on the Moon

    通常、XPath を書くときは //p のようにすることが多いと思いますが、これには名前空間の指定が含まれていないため、XHTML 文書 (MIME タイプが application/xhtml+xml で提供されている文書) では使えません。これに対するアプローチとしては、//h:p のようにあらかじめ XPath 式に名前空間の指定を含めておき、リゾルバによる名前空間接頭辞の解決時に HTML と XHTML とで処理を分けるというのが一般的でした。「XPathNSResolver のクロスブラウザとか」や「document.contentType == "application/xhtml+xml"なページでの$X」で扱っている方法です。 とはいえ、いちいち名前空間接頭辞を指定するのは面倒くさいですし、同じ名前空間に対する接頭辞が人によって違うのも不便です。XPath 式の中で要素名

  • libxmlのHTMLパーサ+XPathでid関数が使えなくてはまる - bits and bytes

    さいきんlibxmlでHTMLを読み込んでXPathで要素を取り出すのが一部([xml][libxml2][c]XMLをHTTPで取得して、XPathで指定された中身をC言語で取り出す方法 - グニャラくんのグニャグニャ備忘録@はてな)ではやっています。 これにちょっと癖があってはまりました。 <html><body> <ul id="list"> <li>hello</li> <li>world</li> </ul> </body></html> こういうHTMLファイルを読み込んで id("list")/li というXPathを評価させるとなぜか何にもマッチしないのです。でもこれを //*[@id="list"]/li に置き換えるとhelloとworldを囲んでいるliふたつにマッチするようになるので、パース自体は問題ないようです。 で、いろいろいじっていたらなんでもいいのでHTML

    kits
    kits 2008/07/14
    XPath仕様としては、id関数を使うには、文書がID型属性を宣言したDTDを持つことが必要
  • 特定のclass属性を持った任意の要素にマッチするXPath | 3.14

    結論特定のclass属性を持った任意の要素にマッチするXPath(hogeは指定したいclass属性名) //*[contains(concat(" ",normalize-space(@class)," "), " hoge ")] 特定の要素にしたい場合は適当に div[contains(concat(" ",normalize-space(@class)," "), " hoge ")] などとする. 概要特定のclass属性を持った任意の要素にマッチするXPathというのはアドオンやUserJavaScriptスクレイピングの際にDOMノードを特定するために良く使いますが,XPathの書き方がマズイ人がたまにいます.普通に考えたらXPathはこうなります. XPath1:: //*[@class="hoge"] class属性は以下の引用部分に書かれているとおり,スタイルシート以

  • perlのxpathコマンド « ku

    XPathを書いたときに、そのXPathがうまくマッチしてくれるかどうかを調べるのは少し面倒です。FirefoxにFirebug(いつの間にか日語のページが…)が入っていればコマンドラインで$xを使って $x( '//span/ancestor::div[last()]' ) というように調べられますが、HTMLファイルにして読み込ませないといけないのと、Firefoxが勝手にtableとtrの間にtbodyを補完してしまうので //table/tr/td[last()] みたいなXPathはマッチしなくて不便です。 いままでperlHTML::TreeBuilder::XPathを使って #!/usr/bin/perl use strict; use warnings; use HTML::TreeBuilder::XPath; my $tree = HTML::TreeBuilde

    kits
    kits 2007/08/03
    「Firefoxが勝手にtableとtrの間にtbodyを補完してしまうので」<HTML仕様上tbodyは1個以上存在するため。cf. http://www.w3.org/TR/html4/struct/tables.html#h-11.2.1
  • 1