我正试图从一个非常长的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脚本中。
提前致谢。
答案 0 :(得分:2)
使用xpath查询更好地使用模块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)