我想从这个网页中提取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代码块:
我的问题是两个:
答案 0 :(得分: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']"
XML / XQuery区分大小写
我已在(1)的查询中更正了它:<div/>
与<DIV/>
不同。 (1)中的两个查询都已产生预期结果。
可以在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"]'