如何使用BaseX命令行从html页面中提取XPATH

时间:2013-06-09 21:03:10

标签: xml xpath xhtml basex

我想从这个网页中提取XPATH // DIV [@id =" ps-content"]:http://www.amazon.com/dp/1449319432(保存为本地文件)

我想用一行命令行和一个最好的解析器来完成它,比如BaseX或Saxon-PE。

到目前为止,我(似乎已经)发现的最短解决方案是这两行:

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

但它返回的所有内容都是一个空行,而不是我预期的html代码块:

我的问题是两个:

2 个答案:

答案 0 :(得分:1)

您的查询存在两个问题:

  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)中的两个查询都已产生预期结果。


  3. 可以在BaseX中使用Tagsoup,您不必单独为HTML输入调用它。确保在默认的Java类路径中包含tagsoup,例如。在Debian中安装libtagsoup-java

    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"]'
    

    使用-i对我使用tagsoup不起作用,但您可以使用doc(...)代替。

答案 1 :(得分: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"]'