Python:为什么Xpath似乎只处理树中的第一个元素?

Python:为什么Xpath似乎只处理树中的第一个元素?,python,html,xpath,Python,Html,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"&g

假设我有这个:

<!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>
但是我只得到了第一个(001.html)。为什么呢?在使用
getroot()
之后,我尝试在树上手动迭代,似乎只有具有第一个url的第一个表可见。我不明白


编辑:我用我发布的示例再次测试,它确实有效,经过一些测试,似乎我去掉了头部,它有效。。。也许里面有什么东西破坏了解析器?我不知道。我想解决这个问题的最好方法是搜索文件并删除
之间的任何内容?因为解析没有按预期工作,所以我无法解析它。因此,我将头部添加到示例中,以使其断裂。

您是否尝试将文档声明为XHTML

示例开头的doctype告诉您使用的是HTML,它不是有效的XML,因此XML解析器可能会在doctype之后停止处理输入。请记住,XPath需要有效的XML输入才能工作


因此,如果使用XHTML doctype,XML解析器将不再打断doctype,而是对输入进行整体解析

使用示例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']

实际上,XPath不需要有效(甚至格式良好)的XML输入就可以工作,它只需要XDM数据模型的一个实例,当然HTML解析器也可以提供这个实例。但是,如果您将HTML放入XML解析器,您肯定会遇到麻烦。
['001.html', '002.html']