1

我试图从一个非常长的 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

4 回答 4

2

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

Beautiful Soup 解析你给它的任何东西,并为你做树遍历的东西。您可以告诉它“查找所有链接”,或“查找类 externalLink 的所有链接”,或“查找所有 url 匹配“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"/>]
于 2013-01-02T23:16:28.437 回答
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
于 2013-01-02T22:10:41.110 回答
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'
于 2013-01-02T22:10:34.257 回答
-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)
于 2018-08-25T01:39:06.123 回答