【问题标题】:Parse html element with lxml / xpath使用 lxml / xpath 解析 html 元素
【发布时间】:2016-02-20 10:38:56
【问题描述】:

使用 lxml/python 和 xpath,我检索了标签之间的值。 我也想获取 html 属性,不仅仅是文本,我的程序可以工作,但跳过了两行。

蟒蛇:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import lxml.html
htmltree = lxml.html.parse('data.html')
res = htmltree.xpath("//table[@class='mainTable']/tr/td/text()")
print '\n'.join(res).encode("latin-1")

data.html 示例

<table class='mainTable'>
         <TR>
                  <TD bgcolor="#cccccc">235</TD>
                  <TD bgcolor="#cccccc"> Windows XP / Office 2003.</TD>
                  <TD bgcolor="#cccccc">
                  G:\REMI\projets\Migration_XP_Office2003\Procedures\Installation Win XP et Office 2003.doc</TD>
                  <TD bgcolor="#cccccc">2005-10-18</TD>
                  <TD bgcolor="#cccccc">2010-12-30</TD></TR>
                  <TD bgcolor="#cccccc">
                  <P class="MsoBodyText" 
                    style="margin: 0cm 0cm 0pt;"><STRONG><FONT face="Times New Roman" size="5">blablablablablablbala<BR><BR></FONT></STRONG></FONT></P>
                  </TD>
                <TR>
                  <TD bgcolor="#cccccc">23</TD>
                  <TD bgcolor="#cccccc">XEROX/ MAC</TD>
                  <TD bgcolor="#cccccc">
                    <P>joint.</P>
                    <P>&nbsp;</P></TD>
                  <TD bgcolor="#cccccc">G:\DDTH_INF\REMI\bdcfiles\I098_Page_de_garde_MAC.doc</TD>
                  <TD bgcolor="#cccccc">2012-12-19</TD>
                  <TD bgcolor="#cccccc">2012-12-19</TD>
         </TR>
 </table>

返回:

 235 Windows XP / Office 2003.
 G:\REMI\projets\Migration_XP_Office2003\Procedures\Installation Win XP
 et Office 2003.doc 2005-10-18 2010-12-30

 23 XEROX/ MAC G:\DDTH_INF\REMI\bdcfiles\I098_Page_de_garde_MAC.doc
 2012-12-19 2012-12-19

我不明白为什么程序跳过了

<P class="MsoBodyText" 
                        style="margin: 0cm 0cm 0pt;"><STRONG><FONT face="Times New Roman" size="5">blablablablablablbala<BR><BR></FONT></STRONG></FONT></P>

和

 <P>joint.</P>
                        <P>&nbsp;</P>

因为它在&lt;p&gt; 标签之间?我只想获取每个 TD 之间的所有数据。我也尝试过 /tr/td/p/ 但这不是解决方案。

注意:此代码是一个示例,可能 html 已损坏,但我的文件结构良好。

【问题讨论】:

  • 尝试res = htmltree.xpath("//table[@class='mainTable']/tr/td//text()")获取所有子文本节点。
  • 简单说明:仅对包含正确 html的html页面使用lxml。您可以在许多地方找到 lxml 无法处理的未封闭标签(实际上只有在 您 编写了 HTML 时才使用它...)。如果不确定,使用 BeautifulSoup 可以很好地修复此类(小)错误。

标签: python html xpath lxml


【解决方案1】:

这是因为您从每个 td 元素中获取了 text() - 这基本上意味着 - 给我一个直接位于 td 元素内的文本节点。

相反,在找到的每个 td 上调用 .text_content():

texts = [td.text_content() for td in htmltree.xpath("//table[@class='mainTable']/tr/td")]

【讨论】:

  • 非常感谢我的朋友,我明白了,我今天才开始使用xpath,我还是个初学者,感谢text()方法的精确含义。
猜你喜欢
  • 2012-08-23
  • 2012-07-12
  • 2012-07-29
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多