【问题标题】:Python: Why is Xpath seemingly only processing the first element in this tree?Python:为什么 Xpath 似乎只处理这棵树中的第一个元素?
【发布时间】:2011-12-10 11:02:44
【问题描述】:

假设我有这个:

<!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>

我想找到页面中的所有 url,然后:

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

但我只得到第一个 (001.html)。这是为什么?在使用 getroot() 之后,我尝试手动迭代树,似乎只有第一个 url 的第一个表是可见的。我不明白。

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

【问题讨论】:

    标签: python html xpath


    【解决方案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']
    

    【讨论】:

      【解决方案2】:

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

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

      因此,如果您使用 XHTML 文档类型,XML 解析器将不再中断该文档类型,并完整地解析输入。

      【讨论】:

      • 实际上 XPath 不需要有效的(甚至是格式良好的)XML 输入就可以工作,它只需要 XDM 数据模型的一个实例,当然 HTML 解析器也可以交付那个。但可以肯定的是,如果您通过 XML 解析器处理 HTML,您可能会遇到麻烦。
      猜你喜欢
      • 2011-02-05
      • 2012-12-27
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      相关资源
      最近更新 更多