Java調用python之lxml解析xpath

一、需求背景:

公司有爬蟲需求,希望通過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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章