2012-01-04 57 views
0

我想解析一个非常不清晰且格式不正确的HTML页面来获取一些信息。高级XPath表达式需要

下面是该页面的一个示例:

<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>属性具有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(我可以后解析它们)

**问题:**

怎么办我得到这些信息?我可以使用@Style属性使用XPath吗?我试过了,但没有奏效。

回答

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); 
} 
+0

感谢您的答案,但它不能解决我的问题,因为我想要的信息是没有'size = 2'属性的dones。 Basicaly,那些@Style。 – 2012-01-04 17:20:06

+0

我的错误..我道歉 – MethodMan 2012-01-04 17:24:26

0

从来就找到了我想要通过使用这些XPath:

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

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

谢谢!

+1

只要注意,你可能不会总是看到'样式'内容的顺序相同,所以文字匹配可能会失败。这就是为什么我在我的答案中采用了“包含”方法。 – 2012-01-04 17:33:24

+0

您的问题确实比我的要好,谢谢您花时间回答我。 我将改变我为实现XPath所做的工作 – 2012-01-04 18:17:41

2

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

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

这将选择font元件没有size属性和具有style属性包含文本#003399,但不是文本small-caps(以努力排除符合其它标准更早font元素) 。

请注意,这将直接返回font元素,而不是他们的子元素。