【问题标题】:xpath selectors not returning a matchxpath 选择器不返回匹配项
【发布时间】:2016-03-22 05:38:47
【问题描述】:

这是一段 HTML 代码:-

source1 = '

    <tr>
        <td bgcolor="#ffffff"><font face="Tahoma" size="2">Gemara</font></td>
        <td bgcolor="#ffffff"><font face="Tahoma" size="2">Kiddushin</font></td>
        <td bgcolor="#ffffff"><font face="Tahoma" size="2">Morning</font></td>

        <td bgcolor="#ffffff"><font face="Tahoma" size="2">12-04-2104</font></td>

        <td colspan=2 bgcolor="#ffffff" nowrap="nowrap"><font face="Tahoma" size="2">
        <a href="#" onClick="listen('05-115-08-2104-12-04.mp3')"><img src="images/play_audio.gif" border="0"></a>
        <a href="#" onClick="mydownload('05-115-08-2104-12-04.mp3')"><img src="images/download.gif" border="0"></a>
        </td>
        <!-- <td bgcolor="#ffffff" nowrap="nowrap"><font face="Tahoma" size="2">

        <a href="http://mgr.uvault.com/yadavraham/media//05-115-08-2104-12-04.mp3">Download</a> 
        </td>
        -->
    </tr>
'

我能够解析 HTML 中的所有数据,只有 Mp3 文件名解析没有返回任何值

请看我下面的代码:

from lxml import html
source2 = html.fromstring(str(source1))

Category = source2.xpath('//tr[1]//td[@bgcolor="#ffffff"][1]//text()')
Book = source2.xpath('//tr[1]//td[@bgcolor="#ffffff"][2]//text()')
Section = source2.xpath('//tr[1]//td[@bgcolor="#ffffff"][3]//text()')
Date = source2.xpath('//tr[1]//td[@bgcolor="#ffffff"][4]//text()')
Mp3filename = source2.xpath('//tr[1]//td[@colspan=2]//a[1]//@onClick')
print Category, Book, Section, Date, Mp3filename

Mp3filename 变量返回 Null 值。我的 Xapth 查询对吗?

【问题讨论】:

  • 您错过了&lt;font&gt; 标签。
  • @KlausD。这不是必需的,路径设置为 Absolute //a[1] 。如果我将 //a[1]//@onClick' 替换为 //a[1]//@href' ,它会返回 '#'

标签: python python-2.7 xpath lxml


【解决方案1】:

看起来lxml.html 将属性名称转换为小写(在 python 2.7 中测试,从问题中复制粘贴的 HTML 没有变化):

raw= '''<tr>
                                    <td bgcolor="#ffffff"><font face="Tahoma" size="2">Gemara</font></td>
                                    <td bgcolor="#ffffff"><font face="Tahoma" size="2">Kiddushin</font></td>
                                    <td bgcolor="#ffffff"><font face="Tahoma" size="2">Morning</font></td>

                                    <td bgcolor="#ffffff"><font face="Tahoma" size="2">12-04-2104</font></td>

                                    <td colspan=2 bgcolor="#ffffff" nowrap="nowrap"><font face="Tahoma" size="2">
                                    <a href="#" onClick="listen('05-115-08-2104-12-04.mp3')"><img src="images/play_audio.gif" border="0"></a>
                                    <a href="#" onClick="mydownload('05-115-08-2104-12-04.mp3')"><img src="images/download.gif" border="0"></a>
                                    </td>
                                    <!-- <td bgcolor="#ffffff" nowrap="nowrap"><font face="Tahoma" Size="2">

                                    <a href="http://mgr.uvault.com/yadavraham/media//05-115-08-2104-12-04.mp3">Download</a> 
                                    </td>
                                    -->
                                    </tr>'''

from lxml import html
source2 = html.fromstring(raw)

Mp3filename = source2.xpath('//tr[1]//td[@colspan=2]//a[1]')
print html.tostring(Mp3filename[0])
# output :
# <a href="#" onclick="listen('05-115-08-2104-12-04.mp3')"><img src="images/play_audio.gif" border="0"></a>
#             ^notice that the attribute name changed to lower-case

所以我建议尝试在您的 XPath 中使用小写的 @onclick

Mp3filename = source2.xpath('//tr[1]//td[@colspan=2]//a[1]/@onclick')

【讨论】:

  • 太棒了,我从来不知道 lxml 将属性节点集转换为小写。这就是所谓的有经验的人详细的眼睛。我做到了 - Mp3filename = source2.xpath('//tr[1]//td[@colspan=2]//font[@face="Tahoma"]//a[1][@href="# "]//@onclick');Mp3filename=str(Mp3filename[0]).replace("listen('",'').replace("')",'').strip()
【解决方案2】:

首先修复您的 HTML,使其成为有效的 xml。

您在最后一个&lt;td&gt; 中缺少&lt;font&gt; 的结束标记。因此 XPath 不会在下面找到任何有效的 xml。

【讨论】:

  • 我做了 html.fromstring(source) ,因此无需将 html 转换为任何 xml schema 。无论如何感谢您的建议。
猜你喜欢
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 2017-12-01
相关资源
最近更新 更多