XQuery Expression - парсинг экрана - Saxon / JTidy

Я работаю над Java Web Scraper, который использует Jtidy / Saxon. Tidy Parsed DOM отправляется в Saxon с выражением XQuery для извлечения данных. У меня проблемы с выражением XQuery.

Веб-сайт: http://www.pacra.com.pk/reports.php. Я хочу извлечь все данные таблицы, это нужно сделать с помощью XQuery для работы со старой системой.

По сути, я хочу пройтись по всем тегам tr в этом XPath //*[@id="mainDiv"]/div/table/tbody

вернуть тег tr Перебрать все теги td в каждом tr тексте возврата в первых 6 тегах td 1, 2, 3, 4, 5, 6

Пока что я придумал

for $tr in //table/tbody
    for $row in $tr/child::tbody/child::tr
        return <tr><td>{data($row/td[1])}</td>
            <td>{data($row/td[1])}</td>
            <td>{data($row/td[2])}</td> 
            <td>{data($row/td[3])}</td>
            <td>{data($row/td[4])}</td>
            <td>{data($row/td[6])}</td>

Мой синтаксис явно неправильный. Я пытаюсь изучить XQuery, но нахождение этого веб-сайта сильно отличается от XML-примера учебного пособия. Если кто-то может помочь, мы будем очень признательны!


person silkyhotdog    schedule 10.08.2015    source источник


Ответы (1)


Вероятно, вам не поможет то, что HTML-код этого веб-сайта недействителен, например:

<table align="center" width="1024px">
    <tr>
        <td align="center" ><div id="mainDiv"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<table>

Обратите внимание на новую страницу html, появившуюся внутри тега <div id="main">. Также я не думаю, что данные, которые вам нужны, на самом деле находятся в div с id="main"!

Тем не менее, вы должны иметь возможность запрашивать его с помощью чего-то вроде:

declare namespace h = "http://www.w3.org/1999/xhtml";

for $tr in /h:html/h:html[2]/h:body/h:div/h:table/h:tr
return
    <tr>{
        $tr/h:td[position() le 6]
    }</tr>

Я использовал HTTP-клиент EXPath для извлечения и преобразования HTML в XML, поэтому у меня сработало следующее:

import module namespace http = "http://expath.org/ns/http-client";
declare namespace h = "http://www.w3.org/1999/xhtml";

for $tr in http:send-request(<http:request href="http://www.pacra.com.pk/reports.php" method="get"/>)[2]/h:html/h:html[2]/h:body/h:div/h:table/h:tr
return
    <tr>{
        $tr/h:td[position() le 6]
    }</tr>
person adamretter    schedule 10.08.2015
comment
Большое спасибо, с вашим примером я смог написать свою собственную версию, не прибегая к использованию EXPath HTTP Client. Именно то, что мне нужно. - person silkyhotdog; 11.08.2015