2012-11-11 108 views
0

我已经将一些HTML文件转换为一个大的txt文件(约50k行),并且想要提取一组特定的网址。我是后的URL是两种模式之一:使用lxml提取网址

首先

<div class="pic"> 
    <a href="https://www.site.com/joesmith"><img alt="Joe Smith" class="person_image" src="https://s3.amazonaws.com/photos.site.com/medium_jpg?12345678"></a> 
</div> 

<div class="name"> 
    <a href="https://www.site.com/joesmith">Joe Smith</a> 
</div> 

,我需要的是https://www.site.com/joesmith的文本。我正在第一次使用lxml,并且我很难将它们组合在一起。

这里是我的代码

from lxml import etree 
from io import StringIO 

def read(filename): 
    file = open(filename, 'r') 
    text = file.read() 
    file.close() 
    out = unicode(text, errors='ignore') 
    return out 

def parse(filename): 
    data = read(filename) 
    parser = etree.HTMLParser() 
    tree = etree.parse(StringIO(data), parser) 
    result = etree.tostring(tree.getroot(), pretty_print=True, method='HTML') 
    urls = result.findall('<div class="name">') 
    return urls 

我试过这个代码都的findall和FINDTEXT,并且无论哪种方式,结果是一样的,“AttributeError错误:‘海峡’对象有没有属性‘的findall’”。我已经确认'结果'是一个字符串type()

我是否在正确的道路上提取URL?我应该如何解决这个属性错误?

回答

2

我不确定基于HTML的树是否支持XPath(我怀疑他们这样做)。在这种情况下,你可以简单地做:

urls = tree.xpath('//div[@class="pics"]/a/@href') + 
     tree.xpath('//div[@class="name"]/a/@href') 
+0

这很好,我甚至不知道xpath。谢谢! – Lenwood