高级XPath表达式需求

时间:2012-01-04 17:08:27

标签: c# html parsing xpath

我正在尝试解析一个非常不清晰且格式不正确的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我已经设法获取查询中使用的查询和文档编号的日期,小时,ID(此信息可以在<font>属性{{1}的行中找到}})。

这是我用来获取所需信息的XPath:

size="2"

我的下一步是检索HtmlNodeCollection tmpNodes = documentModel.DocumentNode.SelectNodes ("//font[@size='2']/b"); 标记之间的信息。在这种情况下,它将是两个字符串:

  1. ==Useful Information

  2. TABELIÃO DE NOTAS E DE PROTESTO DE LETRAS E TÍTULOS(之后我可以解析)

  3. **问题:**

    我如何获得这些信息?我可以使用@Style属性使用XPath吗?我试过了,但没用。

3 个答案:

答案 0 :(得分:2)

您只需要一些方法来唯一标识这些元素。例如:

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

这会选择font元素,但不包含size属性且style属性包含文本#003399,但不包含文本small-caps(在努力排除符合其他标准的早期font元素。

请注意,这会直接返回font元素,而不是其子元素。

答案 1 :(得分:1)

尝试这样的事情..基本上删除尺寸

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

答案 2 :(得分:0)

我通过使用这些XPath找到了我想要的东西:

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

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

谢谢!