如何在命令行中使用带有Saxon-HE的XPath解析HTML?
我使用saxon HE 9.6,它非常适合在解析格式良好的XML文件时使用XPath 3。
但我想知道如何将expath-http-client (或任何其他工作解决方案)与Saxon结合起来, 以便能够解析realLife©®™(可能已损坏)的HTML。 (Java不是我更好的技能)。
我搜索谷歌很多小时没有任何工作解决方案。 我试过类似的东西:
xquery_file.xsl:
xquery version "1.0"; declare namespace http="http://expath.org/ns/http-client"; let $url := 'http://stackoverflow.com' let $response := http:send-request( ) return {$response}
Shell命令取自expath-http-client-saxon-0.10.0的README
saxon --repo /usr/share/java/expath/repo -xsl:sample/simple-get.xsl -it:main
要么
saxon --repo /usr/share/java/expath/repo -xsl:xquery_file.xsl -it:main
没有成功。 我得到: Transformation failed: Unknown configuration property http://saxon.sf.net/feature/repo
理想情况下,我最后要做的是直接从命令行查询一个URL,而不是XQuery文件,而是一个XPath表达式(如果可能的话)。 我很确定那里的一些XML / Java / XPath专家有我正在寻找的解决方案。
/usr/share/java/expath/repo
包含:
/usr/share/java/expath/repo ├── expath-http-client-saxon-0.10.0 │ ├── cxan.xml │ ├── expath-http-client-saxon │ │ ├── jar │ │ │ ├── expath-http-client-java.jar │ │ │ └── expath-http-client-saxon.jar │ │ ├── lib │ │ │ ├── apache-mime4j-0.6.jar │ │ │ ├── commons-codec-1.4.jar │ │ │ ├── commons-logging-1.1.1.jar │ │ │ ├── httpclient-4.0.1.jar │ │ │ ├── httpcore-4.0.1.jar │ │ │ └── tagsoup-1.2.jar │ │ ├── xq │ │ │ └── expath-http-client-saxon.xq │ │ └── xsl │ │ └── expath-http-client-saxon.xsl │ ├── expath-pkg.xml │ └── saxon.xml └── hello-1.1 ├── expath-pkg.xml └── hello ├── hello.xq └── hello.xsl
编辑:
我最好的尝试(基于Linux的解决方案)
java -classpath "./tagsoup-1.2.jar:./saxon9he.jar" \ net.sf.saxon.Query \ -x:org.ccil.cowan.tagsoup.Parser \ -s:myrealLife.html \ -qs://*:body
这项工作,但现在我试图弄清楚如何设置default namespace
,以便能够通过示例//a
直接查询
编辑2
我根据这个POST创建了一个完整的github项目,请查看https://github.com/sputnick-dev/saxon-lint
我认为你不需要任何HTTP客户端。 您可以使用doc()函数读取文件,或者将其作为主输入文档提供,前提是您将其配置为使用HTML SAX解析器而不是XML解析器进行解析。 如果你把John Cowan的TagSoup放在类路径上,那么就调用Saxon
-x:org.ccil.cowan.tagsoup.Parser -s:myrealLife.html
应该做的伎俩。
我想你也可以使用validator.nu,它比HTMLS比HTMLS更加快速,但我自己没有尝试过。
如果您查看EXPath HTTP Client的文档,您将看到如果您使用它检索HTML,并且服务器使用HTML Internet Media Type进行响应,那么HTML将自动整理为有效的XML,请参阅此处http://expath.org/spec/http-client#d2e517 。
因此,您无需编写任何Java代码即可实现目标。
您的XQuery不正确,因为您尝试使用eXist-db的HTTP客户端,而您声明要使用EXPath HTTP客户端。 所以你应该将你的XQuery改为:
xquery version "1.0"; declare namespace http="http://expath.org/ns/http-client"; let $url := 'http://stackoverflow.com' let $response := http:send-request( ) return {$response}
但是,您还需要说服Saxon加载并使用EXPath HTTP Client模块,默认情况下,Saxon没有HTTP客户端的本机支持,请参阅http://saxonica.com/documentation/index.html#!functions 。
你可以在这里找到Saxon的EXPath HTTP客户端实现: https : //code.google.com/p/expath-http-client/downloads/list ,如果你下载最新的Zip文件,里面是一个README文件告诉你如何与撒克逊人一起使用它。