2010-05-10 83 views
4

有这样的html代码:我如何获得一个HTML元素与Python LXML

<table> 
<tr> 
    <td class="test"><b><a href="">aaa</a></b></td> 
    <td class="test">bbb</td> 
    <td class="test">ccc</td> 
    <td class="test"><small>ddd</small></td> 
</tr> 
<tr> 
    <td class="test"><b><a href="">eee</a></b></td> 
    <td class="test">fff</td> 
    <td class="test">ggg</td> 
    <td class="test"><small>hhh</small></td> 
</tr> 
</table> 

我用这个Python代码与LXML模块提取所有<td class="test">

import urllib2 
import lxml.html 

code = urllib.urlopen("http://www.example.com/page.html").read() 
html = lxml.html.fromstring(code) 
result = html.xpath('//td[@class="test"][position() = 1 or position() = 4]') 

它很好用!其结果是:

<td class="test"><b><a href="">aaa</a></b></td> 
<td class="test"><small>ddd</small></td> 


<td class="test"><b><a href="">eee</a></b></td> 
<td class="test"><small>hhh</small></td> 

(因此第一和的每个<tr>第四列) 现在,我来提取:

AAA(链接的标题)

ddd<small>标签之间的文本)

EEE(链接的标题)

HHH<small>标签之间的文本)

我怎么能提取这些价值?

(问题是,我不得不删除<b>标签,并获得锚标题上第一列和第四列删除<small>标签)

谢谢!

回答

4

为什么不直接在每一步获取你想要的东西?

links = [el.text for el in html.xpath('//td[@class="test"][position() = 1]/b/a')] 
smalls = [el.text for el in html.xpath('//td[@class="test"][position() = 4]/small')] 
print zip(links, smalls) 
# => [('aaa', 'ddd'), ('eee', 'hhh')] 
8

如果你这样做el.text_content(),你会从每个元素去除所有标签的东西,即:

result = [el.text_content() for el in result]