2013-01-02 48 views
1

我试图从一个非常长的html文件中挑选图片的网址。该文件看起来是这样的:从HTML中挑选图片网址

...Lots_of_html><a href=somelink.com>Human Readable Text</a><img src="http://image.com">.... 

我想挑选出从上面的HTML的http://image.com,我试过,没有运气以下:

sed -n ‘s%.*src=%%;s%\".*%%p’ image_urls.txt 

sed -n ‘s%.*src=%%;s%\".*%%p’ image_urls.txt 


import re 
rex = re.compile(r'src=.(.*?)>',re.S|re.M) 
data="<long html string>" 
match = rex.match(data) 

我没有得到在正则表达式事物方面有很多经验,所以我想在上面有一些基本的错误。我会很感激任何帮助,但特别是我希望得到一个sed命令,因此很容易将其集成到bash脚本中。

在此先感谢。

+5

基本错误是试图用正则表达式解析HTML文档使用HTML解析器 – Quentin

+2

别编写你自己的代码来解析HTML,当然不要用正则表达式来解析它。解析HTML是一个解决的问题,并且有大量的Python库不存在这里已经被写入,测试和调试,这样你就不必编写,测试和调试你自己的代码来完成它。 –

回答

0

perl的

既然你已经有两个Python的解决方案,这里有一个方法,你可以用Perl WWW ::机械化做到这一点:

perl -MWWW::Mechanize -e ' 
    $m = WWW::Mechanize->new; 
    $m->get($ARGV[0]); 
    $m->dump_images(undef, 1)' file://`pwd`/image_urls.txt 

sed的

如果可以的话对输入做一些假设,你可能会用一个简单的sed正则表达式逃脱。

这里是你如何可以使用SED与您提供的测试数据:

sed -n 's%.*src="\([^"]*\)".*%\1%p' 

这抓住了引号之间的内容\1并删除一切。

你也可以按照自己的方式做到这一点,小心什么是匹配。你的第二个替代命令删除太多。下面就来避免它的一种方法:

sed -n 's%.*src="%%; s%".*%%p' 
+0

非常感谢,第二条命令正是我所期待的! – James

+0

这很棒,直到你有''或者''。您还将从'''等标签中提取'src'属性。 –

+1

@AndyLester:实际上,只有在能够对输入顺序进行假设时才应该使用这个函数。 – Thor

2

更好地利用使用查询模块urllib2 + lxml。举个例子:

#!/usr/bin/env python 
# -*- coding: utf8 -*- 
# vim:ts=4:sw=4 

import cookielib, urllib2 
from lxml import etree 

cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
page = opener.open("http://stackoverflow.com/q/14129900/465183") 
page.addheaders = [('User-agent', 'Mozilla/5.0')] 
reddit = etree.HTML(page.read()) 

for img in reddit.xpath('//img/@src'): 
    print img 
2

既然你这个标记像Python我会用BeautifulSoup

美丽的汤解析什么,你给它,并执行树遍历的东西给你。你可以告诉它“查找所有链接”,或者“查找外部链接类的所有链接”,或者“查找所有与urls匹配的链接”foo.com“,或者”查找带有粗体文本的表格标题,然后给出我说文“

>>> from bs4 import BeautifulSoup 
>>> html = """<a href=somelink.com>Human Readable Text</a><img src="http://image.com">""" 
>>> soup = BeautifulSoup(html) 
>>> img_tags = soup.find_all("img") 
>>> for img in img_tags: 
>>> ...  print img.get("src") 
http://image.com 

或者你可以做到这一点更简单:。

>>> soup.find_all("img", src="http://image.com") 
[<img src="http://image.com"/>] 
+0

谢谢,这可能是非常有用的。 – James