Основанное на XPath извлечение содержания от страниц HTML

Я пытаюсь извлечь на основе содержимого на данном xpath. Когда это - всего один элемент, я хочу извлечь, нет никакой проблемы. Когда у меня есть список объектов, соответствующих этому xpath, затем я получаю nodelist, и я могу извлечь значения.

Однако существует пара объектов, связанных друг с другом формирующим группу, и та группа повторяется.

Одним путем я мог сделать, должен получить nodelist родительского узла всех таких групп и затем применить основанный на 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, но не универсального, который мог проанализировать любую данную спецификацию.

Я должен смочь создать a list из map из attribute-value сверху.

Кто-либо попробовал это?

Список РЕДАКТИРОВАНИЯ входа xpaths:

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_names, второй выберет все количества. Таким образом, я буду освобождать co-отношение в этих частях.

Надежда это очищает мои требования.

Спасибо Nayn

0
задан Nayn 25 August 2010 в 14:36
поделиться

5 ответов

Я думаю, что XQuery — отличное решение для очистки экрана. Вы можете использовать процессор Saxon для выполнения ваших xqueries. Кроме того, вы можете использовать расширение Piggy Bank для Firefox, чтобы легко находить выражения XPath, касающиеся контента, который вы хотите извлечь с веб-страницы, который вы можете использовать в своих xqueries.

2
ответ дан 4 September 2019 в 00:48
поделиться

Я не понимаю, чего вы хотите достичь и как это соотносится с XPath. Если вы хотите сопоставить XML с объектами Java, может помочь JAXB , но он основан на схемах XML, а не на XPath.

0
ответ дан 4 September 2019 в 00:48
поделиться

Я не уверен, что понял ваш вопрос, но похоже, что вы хотите использовать XPath в HTML-документах.

Чтобы использовать XPath, просматриваемый HTML-документ должен быть правильно сформирован. Есть несколько парсеров HTML для Java; в этой статье сравниваются 4 из них.

HtmlCleaner , кажется, предлагает то, что вам нужно. Это позволяет выполнять подмножество XPath в «очищенных» HTML-документах. По-видимому, он не поддерживает полный набор выражений XPath, см. документацию .

Если вам требуются более сложные выражения XPath, чем то, что поддерживает HtmlCleaner, вам может потребоваться использовать пакет javax.xml.xpath с правильно сформированным документом XHTML. JTidy может конвертировать HTML-документ в XHTML-документ.

Надеюсь, это ответ на ваш вопрос.

3
ответ дан 4 September 2019 в 00:48
поделиться

Не знаю, поможет ли это, но я использую XSLT, чтобы перейти от данных к HTML. Мне кажется, что вам просто нужно немного структурировать выполнение XPATH, и XSLT для этого хорош.

0
ответ дан 4 September 2019 в 00:48
поделиться

Почему бы не применить 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(";"));
}
1
ответ дан 4 September 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: