2011-10-27 38 views
2

假設我有這樣的:Python:爲什麼Xpath看似只處理這棵樹中的第一個元素?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<HTML LANG="ja"> 
<HEAD> 
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
<META name="GENERATOR" content="snanail Version 2.18"> 
<TITLE>-www.example.org-</TITLE> 

<STYLE type="text/css"> 
<!-- 
H1.TITLE { 
font-size : 10 pt; 
font-family : "Arial"; 
color : #FFFFFF; 
} 
--> 
</STYLE> 

</HEAD> 
<BODY> 
<CENTER> 
<TABLE BORDER="0" CELLSPACING="1" CELLPADDING="6" ALIGN="CENTER"> 
<TR> 
    <TD WIDTH="100"> 
    <TABLE ALIGN="CENTER" CELLPADDING="4" CELLSPACING="1"> 
     <TR> 
     <TD HEIGHT="100" WIDTH= "68" ALIGN="CENTER" VALIGN="MIDDLE"> 
      <A HREF="001.html" TARGET="_blank"><IMG SRC="001_thumb.png" WIDTH="56" HEIGHT="80" ALT="001_thumb.png" BORDER="0"></A> 
     </TD> 
     </TR> 
     <TR> 
     <TD HEIGHT="40" ALIGN="CENTER" VALIGN="MIDDLE"> 
      <FONT SIZE="2" COLOR="#FFFFFF">001.jpg</FONT><BR> 
      <FONT SIZE="2" COLOR="#FFFFFF">300 x 300 (806 KB)</FONT><BR> 
     </TD> 
     </TR> 
    </TABLE> 
    </TD> 
    <TD WIDTH="100"> 
    <TABLE ALIGN="CENTER" CELLPADDING="4" CELLSPACING="1"> 
     <TR> 
     <TD HEIGHT="100" WIDTH= "68" ALIGN="CENTER" VALIGN="MIDDLE"> 
      <A HREF="002.html" TARGET="_blank"><IMG SRC="002_thumb.png" WIDTH="56" HEIGHT="80" ALT="002_thumb.png" BORDER="0"></A> 
     </TD> 
     </TR> 
     <TR> 
     <TD HEIGHT="40" ALIGN="CENTER" VALIGN="MIDDLE"> 
      <FONT SIZE="2" COLOR="#FFFFFF">002.jpg</FONT><BR> 
      <FONT SIZE="2" COLOR="#FFFFFF">300 x 300 (627 KB)</FONT><BR> 
     </TD> 
     </TR> 
    </TABLE> 
    </TD> 
</TR> 
</TABLE> 
</CENTER> 
</HTML> 

而且我想找到頁面中所有的網址,並做到:

tree = lxml.html.parse('example.html') 
links = tree.xpath('//a/@href') 

但我只得到了第一個(001.html)。這是爲什麼?我手動嘗試使用getroot()後遍歷樹,似乎只有第一個表的第一個URL是可見的。我不明白。

編輯:我跟我張貼的例子再次測試,它實際工作,和一些測試後,就好像我移開磁頭,它的工作原理...也許有東西在裏面更是打破瞭解析器?我不知道。我想解決這將是搜索文件並刪除<head></head>之間的任何東西的最佳方式?由於解析不能按預期工作,所以我無法解析它。所以我把這個頭添加到了這個例子中。

回答

1

使用例如HTML文件,這個腳本:

from lxml import etree 

parser = etree.HTMLParser(encoding='utf8') 
tree = etree.parse('source.html', parser) 
print tree.xpath('//a/@href') 

給出:

['001.html', '002.html'] 
0

沒有嘗試聲明您的文檔作爲XHTML?

在你的例子開始的DOCTYPE告訴你正在使用的HTML,這不是有效的XML,因此XML解析器可能會停止只是DOCTYPE後處理輸入。請記住,XPath需要有效的XML輸入才能工作。

所以,如果你使用XHTML文檔類型,XML解析器將沒有更多的DOCTYPE突破,並分析其全部輸入。

+0

的XPath實際上並不需要爲了工作,它有效(甚至是合格的)XML輸入只需要XDM數據模型的一個實例,並且HTML解析器當然可以提供該實例。但是,當然,如果你通過XML解析器放置HTML,你很可能會遇到麻煩。 –

相關問題