[英]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.