Усовершенствованная потребность в XPath-выражении

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

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

<form name="Form_Envio" method="post" action="/protesto/ieptb/SP/busca/SinProtIF15.php"><code>== Content
&lt;p&gt;&lt;font size="1" face="Verdana, Arial" color="#FF0000"&gt;IMPORTANTE: ESTA INFORMAÇÃO REFERE-SE APENAS A PESQUISA,NÃO TENDO VALIDADE DE CERTIDÃO&lt;/font&gt;
&lt;/p&gt;</code><p><code>&lt;font size="1" face="Verdana, Arial" color="#003399"&gt;Pesquisa efetuada em: &lt;/font&gt;
&lt;font size="2" face="Verdana, Arial" color="#003399"&gt;&lt;b&gt;04/01/2012&lt;/b&gt;&lt;/font&gt;
&lt;font size="1" face="Verdana, Arial" color="#003399"&gt; às &lt;/font&gt;
&lt;font size="2" face="Verdana, Arial" color="#003399"&gt;&lt;b&gt;14:15:03&lt;/b&gt;&lt;/font&gt;
&lt;font size="1" face="Verdana, Arial" color="#003399"&gt;   N. &lt;/font&gt;
&lt;font size="2" face="Verdana, Arial" color="#003399"&gt;&lt;b&gt;22620645&lt;/b&gt; &lt;/font&gt;
&lt;font size="1" face="Verdana, Arial" color="#003399"&gt;RETROATIVO A CINCO ANOS ATÉ &lt;/font&gt;
&lt;font size="2" face="Verdana, Arial" color="#003399"&gt;&lt;b&gt;26/12/2011&lt;/b&gt;&lt;/font&gt;
&lt;font size="1" face="Verdana, Arial" color="#003399"&gt;&lt;b&gt;Pesquise tambem pelo R.G.&lt;/b&gt; Para o &lt;/font&gt;
&lt;font size="2" face="Verdana, Arial" color="#003399"&gt;&lt;b&gt;C.P.F. N. 000.923.266-41&lt;/b&gt;&lt;/font&gt;
&lt;font size="2" face="Verdana, Arial" color="#003399"&gt;NAS CIDADES PARTICIPANTES &lt;/font&gt;

&lt;font&gt;CONSTA(M) PROTESTO(S) POR FALTA DE PAGAMENTO, NO(S) SEGUINTE(S) TABELIONATO(S)&lt;/font&gt;
== Next line is the start of useful information
&lt;font&gt;&lt;b&gt;TABELIÃO DE NOTAS E DE PROTESTO DE LETRAS E TÍTULOS&lt;/b&gt;&lt;/font&gt;
&lt;font&gt;     AV. VEREADOR JOÃO FERNANDES DA SILVA, 180 - Telefone: 11 4640-4542 fax 4642-3285     VILA VIRGINIA - ITAQUAQUECETUBA - SP&lt;/font&gt;
== End of useful information
&lt;font size="2" face="Times,Verdana,Arial" color="#003399"&gt;&lt;font&gt;Caso deseje mais informações sobre credor, valor e etc. &lt;/font&gt;&lt;font&gt;CLIQUE AQUI, &lt;/font&gt;&lt;font&gt;para requerer sua Certidão de Protesto.&lt;/font&gt;
== End of Content
&lt;/font&gt;</code><font size="2" face="Times,Verdana,Arial" color="#003399"> </font></p><p><font size="2" face="Times,Verdana,Arial" color="#003399"> </font></p><font size="2" face="Times,Verdana,Arial" color="#003399">

 <p> Имея HTML выше, мне уже удалось получить дату, час, идентификатор номера запроса и документа, используемых в запросе (эту информацию можно найти в строках, в которых атрибут <font> имеет <code>size="2"</code>).</font></p><font> <p> Это XPath, который я использовал для получения необходимой мне информации:</p> <pre class="prettyprint linenums">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     VILA VIRGINIA - ITAQUAQUECETUBA - SP AV. VEREADOR JOÃO FERNANDES DA SILVA, 180 - Telefone: 11 4640-4542 fax 4642-3285     VILA VIRGINIA - ITAQUAQUECETUBA - SP (я могу проанализировать их после)

** Вопрос: **

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

3 ответа

Вам просто нужен способ однозначного определения этих элементов. Например:

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

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

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


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

XmlDocument xml = new XmlDocument();
xml.LoadXml(str); 
XmlNodeList xnList = xml.SelectNodes"//font[size='2']/b");
foreach (XmlNode xn in xnList)
{
 Console.WriteLine(xn.InnerText);
}


Я нашел то, что я хотел, используя эти XPaths:

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

а также

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

Благодаря !

licensed under cc by-sa 3.0 with attribution.