使用lxml提取URL

时间:2012-11-11 03:30:18

标签: python parsing extract lxml

我已经将一些HTML写入一个大的txt文件(~50k行),并且想要提取一组特定的URL。我所追求的URL有以下两种模式之一:

第一

<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:'str'对象没有属性'findall'”。我已确认'result'是一个包含type()的字符串。

我是否走上正确的道路来提取网址?我该如何解决这个属性错误?

1 个答案:

答案 0 :(得分:2)

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

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