一、需求背景:
公司有爬蟲需求,希望通過xpath解析網頁,最早的版本是調用Java版本的Jsoup來完成的,但是Jsoup只能處理一些簡單的xpath,對於一些特殊函數的xpath無法支持,後來又通過使用xpath2selector用來處理高級xpath問題,但是xpath2selector也存在一些問題,不能支持部分高級函數以及亂碼問題,java版本使用xpath太難尋找,最終決定使用python作爲解析xpath的語言。
二、需求分析
用python解析xpath需要解決兩個問題
1.Java調用python
2.python 解析xpath
三、需求實現
1、Java調用python
剛開始的時候使用Jython作爲Java和python之間的互通工具,測試之後確實可以使用,但是等到使用python的時候發現Jython不支持lxml,最後決定使用Java原生調用命令行的方式。以下爲Java原生調用python的解決方案
String[] args = ["本機python路徑","python腳本路徑","傳入參數一","傳入參數二"]; //注:在linux環境中每個傳入的參數長度不能超過132kb
Process proc;
try {
proc = Runtime.getRuntime().exec(args);
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result.append(line).append('\n');
}
in.close();
proc.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
2、python接收數據並用lxml處理返回
1:接收數據
import sys
from lxml import etree
xpath = sys.argv[1]
content = sys.argv[2]
2:xpath處理
source = ""
xpath = ""
html = etree.HTML(source)//source爲html文本
for e in html.xpath(xpath):
xml = etree.tostring(e,pretty_print=True, method="html").strip() //xml即爲所得到的xpath解析結果,返回即可
//若出現亂碼問題添加encoding="utf-8",一般編碼問題都可以解決
xml = etree.tostring(e,encoding="utf-8",pretty_print=True, method="html").strip()
//若仍未亂碼,有可能爲源碼爲編譯後的html代碼,需要解析
source = source.decode("utf-8")
html = etree.HTML(source)//source爲html文本
3、環境搭配
pip install lxml