簡體   English   中英

從HTML頁面提取基於XPATH的內容

[英]XPATH based content extraction from html pages

我試圖基於給定的xpath提取內容。 當我只想提取一個元素時,就沒有問題。 當我有一個與該xpath匹配的項目列表時,便得到了節點列表,並且可以提取值。

但是,有幾個相互關聯的項目組成一個小組,而該小組會重復自己。

我可以做的一種方法是獲取所有此類組的父節點的節點列表,然后應用基於SAX的解析技術來提取信息。 但這會引入模式特定的編碼。 我想使其通用。 例如

<html><body>
<!--... a lot divs and other tags ... -->
<div class="divclass">
<item>
     <item_name>blah1</item_name>
     <item_qty>1</item_qty>
     <item_price>100</item_price>
</item>
</div>
<div class="divclass">
<item>
     <item_name>blah2</item_name>
     <item_qty>2</item_qty>
     <item_price>200</item_price>
</item>
</div>
<div class="divclass">
<item>
     <item_name>blah3</item_name>
     <item_qty>3</item_qty>
     <item_price>300</item_price>
</item>
</div>
</body></html>

我可以輕松地為此 xml編寫代碼,但不能解析任何給定的規范的通用代碼。

我應該能夠從上面創建一個attribute-value map list

有人嘗試過嗎?

編輯輸入xpath的列表:

1. "html:div[@class='divclass']/item/item_name"
2. "html:div[@class='divclass']/item/item_qty"
3. "html:div[@class='divclass']/item/item_price"

預期輸出為簡單文本:

 item_name:blah1;item_qty:1;item_price:100
 item_name:blah2;item_qty:2;item_price:200
 item_name:blah3;item_qty:3;item_price:300

這里的關鍵是,如果我分別應用每個xpath,它將垂直獲取我的結果,即第一個將獲取所有item_name,第二個將獲取所有qty。 因此,我將放松這些部分中的相互關系。

希望這能清除我的要求。

謝謝內恩

我不確定是否收到您的問題,但是聽起來您想在HTML文檔上使用XPath。

要使用XPath,需要正確編寫HTML文檔。 有幾個Java的HTML解析器。 本文比較了其中的4個。

HtmlCleaner似乎提供了您所需要的。 它允許在“清理過的” HTML文檔上執行XPath的子集。 顯然,它不支持整套XPath表達式,請參閱文檔

如果您需要比HtmlCleaner支持的更復雜的XPath表達式,則可能需要將javax.xml.xpath包與格式正確的XHTML文檔一起使用。 JTidy可以將HTML文檔轉換為XHTML文檔。

我希望這回答了你的問題。

我認為XQuery是抓取屏幕的絕佳解決方案。 您可以使用Saxon處理器執行xqueries。 此外,您可以使用Piggy Bank Firefox擴展輕松地找到XPath表達式,該表達式與要從網頁中提取的內容有關,您可以在xqueries中使用它們。

為什么不分兩個步驟應用XPath。

首先使用XPath來獲取記錄(輸出中的行):

//div[@class='divclass']/item

然后,XPath獲取相對於每條記錄的字段(列):

item_name
item_qty
item_price

這是工作代碼(使用Javascript,Windows腳本),可為您提供所需的輸出:

var doc = new ActiveXObject("MSXML.DOMDocument");
doc.load("test.xml");

// XPATH #1
var recordXPath = "//div[@class='divclass']/item";
// XPATHS #2, in a dictionary ("field name":"XPath")
var fieldXPaths = { item_name : "item_name",
                    item_qty : "item_name",
                    item_price : "item_price" };

var items = doc.selectNodes(recordXPath);
for (var itemCtr = 0; itemCtr < items.length; itemCtr++) {
    var item = items[itemCtr];
    var fieldEntries = [];

    for (var fieldName in fieldXPaths) {
        var fieldXPath = fieldXPaths[fieldName];
        var fieldNode = item.selectSingleNode(fieldXPath);
        fieldEntries.push(fieldNode.tagName + ":" + fieldNode.text);
    }
    WScript.Echo(fieldEntries.join(";"));
}

我不了解您想要實現什么以及它與XPath的關系。 如果要將XML映射到Java對象,則JAXB可能會有所幫助,但它基於XML模式,而不是XPath。

我不知道這是否有幫助,但是我使用XSLT從數據到HTML的另一種方式。 在我看來,您只需要稍微結構化XPATH執行,而XSLT就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM