Требуется расширенное выражение XPath - PullRequest
0 голосов
/ 04 января 2012

Я пытаюсь разобрать очень нечеткую и недостаточно отформатированную HTML-страницу для получения некоторой информации.

Вот один пример этой страницы:

<form name="Form_Envio" method="post" action="/protesto/ieptb/SP/busca/SinProtIF15.php">
<font size="2" face="Verdana, Arial"><input type="button" value="NOVA PESQUISA" id="nvp" onMouseOver="hand(this);" onmouseout="pointer(this);" onClick="limpa_jucka()"></font>
== Content
<font size="1" face="Verdana, Arial" color="#FF0000"><p align="center">IMPORTANTE: ESTA INFORMAÇÃO REFERE-SE APENAS A PESQUISA,<br>NÃO TENDO VALIDADE DE CERTIDÃO</font>
<font size="1" face="Verdana, Arial" color="#003399"><p align="left">Pesquisa efetuada em: </font>
<font size="2" face="Verdana, Arial"  color="#003399"><b>04/01/2012</b></font>
<font size="1" face="Verdana, Arial" color="#003399"> &agrave;s </font>
<font size="2" face="Verdana, Arial" color="#003399"><b>14:15:03</b></font>
<font size="1" face="Verdana, Arial" color="#003399">&nbsp;&nbsp;&nbsp;N. </font>
<font size="2" face="Verdana, Arial" color="#003399"><b>22620645</b> <br></font>
<font size="1" face="Verdana, Arial" color="#003399">RETROATIVO A CINCO ANOS AT&Eacute;    </font>
<font size="2" face="Verdana, Arial" color="#003399"><b>26/12/2011</b><br></font>
<font size="1" face="Verdana, Arial" color="#003399"><b>Pesquise tambem pelo R.G.</b>  <br>Para o </font>
<font size="2" face="Verdana, Arial" color="#003399"><b>C.P.F. N. 000.923.266-41</b></font>
<font size="2" face="Verdana, Arial" color="#003399"><br>NAS CIDADES PARTICIPANTES </font></font>
<font size="2" face="Verdana, Arial" color="#003399"><br></font>
<font style="font:bold small-caps 9pt/11pt sans-serif,arial;color:#003399;">CONSTA(M) PROTESTO(S) POR FALTA DE PAGAMENTO, NO(S) SEGUINTE(S) TABELIONATO(S)<br><br></b></font></font>
== Next line is the start of useful information
<font style="font:bold 10pt/12pt sans-serif,arial;color:#003399;"><b>TABELIÃO DE NOTAS E DE PROTESTO DE LETRAS E TÍTULOS</b></font>
<font style="font:8pt/9pt sans-serif,arial;color:#003399;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AV. VEREADOR JOÃO FERNANDES DA SILVA, 180 - Telefone: 11 4640-4542 fax 4642-3285<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VILA VIRGINIA - ITAQUAQUECETUBA - SP<br><br></font>
== End of useful information
<font size="2" face="Times,Verdana,Arial" color="#003399"><table border="0" bgcolor="#00AADD" width="100%"><tr align="left" id="tpc" onmouseover="change_hand(this);" onmouseup="put_s25();">
<font style="font:bold 8pt/9pt sans-serif,arial;color:#000000;">Caso deseje mais informa&ccedil;&otilde;es sobre credor, valor e etc. </font><br>
<font style="font:bold 11pt/13pt sans-serif,arial;color:#0000FF;">CLIQUE AQUI, </font>
<font style="font:bold 8pt/9pt sans-serif,arial;color:#000000;">para requerer sua Certid&atilde;o de Protesto.</tr></table></font>
== End of Content


Имея приведенный выше HTML-код, мне уже удалось получить дату, час, идентификатор запроса и номер документа, использованного в запросе (эту информацию можно найти в строках, в которых атрибут <font> имеет size="2").

Это XPath, который я использовал для получения необходимой информации:

HtmlNodeCollection tmpNodes = documentModel.DocumentNode.SelectNodes ("//font[@size='2']/b");

Мой следующий шаг - получить информацию, найденную между разметкой ==Useful Information. В этом случае это будут две строки:

  1. TABELIÃO DE NOTAS E DE PROTESTO DE LETRAS E TÍTULOS

  2. AV. VEREADOR JOÃO FERNANDES DA SILVA, 180 - Telefone: 11 4640-4542 fax 4642-3285<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VILA VIRGINIA - ITAQUAQUECETUBA - SP (я могу разобрать их после)

** Вопрос: **

Как мне получить эту информацию? Могу ли я использовать XPath с помощью атрибута @Style? Я пытался, но это не сработало.

Ответы [ 3 ]

2 голосов
/ 04 января 2012

Вам просто нужен какой-то способ уникальной идентификации этих элементов. Например:

//font[not(@size) and contains(@style, '#003399') 
                  and not(contains(@style, 'small-caps'))]

При этом выбираются элементы font без атрибута size и атрибутом style, который содержит текст #003399, но не текст small-caps (чтобы исключить более ранние элементы font, которые соответствуют другим критериям).

Обратите внимание, что это возвращает элементы font напрямую, а не их дочерние элементы.

1 голос
/ 04 января 2012

Попробуйте что-то вроде этого .. в основном удалите "@" размером

XmlDocument xml = new XmlDocument();
xml.LoadXml(str);     
XmlNodeList xnList = xml.SelectNodes"//font[size='2']/b");
foreach (XmlNode xn in xnList)
{
  Console.WriteLine(xn.InnerText);
}
0 голосов
/ 04 января 2012

Я нашел то, что хотел, используя следующие XPath:

//font[@style='font:bold 10pt/12pt sans-serif,arial;color:#003399;']/b

и

//font[@style="font:8pt/9pt sans-serif,arial;color:#003399;']

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...