从HTML中挑出图片网址

时间:2013-01-02 22:00:09

标签: python sed awk html-parsing

我正试图从一个非常长的html文件中挑选出一个图像的url。该文件看起来像这样:

...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脚本中。

提前致谢。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

由于您将其标记为Python,我会使用BeautifulSoup

  

美丽的汤解析你给它的任何东西,并为你做树遍历的东西。您可以告诉它“查找所有链接”,或“查找类externalLink的所有链接”,或“查找其网址匹配的所有链接”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"/>]

答案 2 :(得分:0)

<强> perl的

由于你已经有两个python解决方案,这里有一种方法你可以使用perl WWW :: Mechanize:

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'

答案 3 :(得分:-1)

您可以使用此功能。

#
#
# get_url_images_in_text()
#
# @param html - the html to extract urls of images from him.
# @param protocol - the protocol of the website, for append to urls that not start with protocol.
#
# @return list of images url.
#
#
def get_url_images_in_text(html, protocol):
    urls = []
    # Do regex for get all images urls, here i get only urls of png and jpg but you can add any prefix that you want.
    all_urls = re.findall(r'((http\:|https\:)?\/\/[^"\' ]*?\.(png|jpg))', html, flags=re.IGNORECASE | re.MULTILINE | re.UNICODE)
    for url in all_urls:
        if not url[0].startswith("http"):
            urls.append(protocol + url[0])
        else:
            urls.append(url[0])

    return urls

#
#
# get_images_from_url()
#
# @param url - the url for extract images url from him. 
#
# @return list of images url.
#
#
def get_images_from_url(url):
    protocol = url.split('/')[0]
    resp = requests.get(url)
    return get_url_images_in_text(resp.text, protocol)