从发布的链接/和发布的页面中提取主图像

时间:2015-12-24 17:08:48

标签: python django

游戏计划是提取这些主要图像,并将其显示在索引页面的缩略图中。我对这个功能有很多麻烦,似乎互联网上没有这个功能的例子。 我找到了三个选择 1. beautifulsoup //似乎人们最常使用这种方法,但我不知道美丽如何找到代表性的形象...它也需要我认为最多的工作。 2. python goose //看起来合法。文档说它提取主要图像,我想我需要相信他们的话。问题是我不知道如何在django中使用它。 3. embedly // ....也许是我需要的功能的错误选择。我想在这个项目中使用python goose。 我的问题是你如何解决这个问题?你知道任何一个例子还是可以提供一些我可以看的例子?从用户提供到我的页面的图像中提取图像我可以使用sorl-thumbnail(对吗?_)但是对于发布的链接.... ??

Edit1:使用python goose,似乎(主要)图像抓取非常简单。问题是我不确定如何将脚本用于我的应用程序,我应该如何将该图像转换为右图标并显示在我的index.html上... 这是我的media.py(不确定它是否有效

496

来源:https://blog.openshift.com/day-16-goose-extractor-an-article-extractor-that-just-works/ 博客的例子是使用flask,我试图为使用django的人制作脚本

编辑2:好的,这是我的方法。我认为这是对的,但不幸的是它并没有给我任何东西。没有错误或没有图像,但python语法是正确的....如果有人为什么它不工作请告诉我

Models.py

类Post(models.Model):     url = models.URLField(max_length = 250,blank = True,null = True)

  import json
from goose import Goose

def extract(request):
    url = request.args.get('url')
    g = Goose()
    article = g.extract(url=url)
    resposne = {'image':article.top_image.src}
    return json.dumps(resposne)

的index.html

def extract(request, url):
    url = requests.POST.get('url')
    g = Goose()
    article = g.extract(url=url)
    resposne = {'image':article.top_image.src}
    return json.dumps(resposne) 

1 个答案:

答案 0 :(得分:3)

BeautifulSoup将是实现这一目标的方式,实际上非常容易。

首先,HTML中的图像如下所示:

<img src="http://www.url.to/image.png"></img>

我们可以使用BeautifulSoup提取所有img代码,然后找到src代码的img。这可以通过以下方式实现。

from bs4 import BeautifulSoup #Import stuff
import requests

r  = requests.get("http://www.site-to-extract.com/") #Download website source

data = r.text  #Get the website source as text

soup = BeautifulSoup(data) #Setup a "soup" which BeautifulSoup can search

links = []

for link in soup.find_all('img'):  #Cycle through all 'img' tags
    imgSrc = link.get('src')   #Extract the 'src' from those tags
    links.append(imgSrc)    #Append the source to 'links'

print(links)  #Print 'links'

我不知道您打算如何决定使用哪个图片作为缩略图,但您可以通过网址列表并提取您想要的图片。

<强>更新

我知道你说dJango,但我强烈推荐Flask。它更简单,但仍然非常实用。

我写了这个,它只显示你给它的任何网页的第一张图片。

from bs4 import BeautifulSoup #Import stuff
import requests
from flask import Flask
app = Flask(__name__)

def getImages(url):
    r  = requests.get(url) #Download website source

    data = r.text  #Get the website source as text

    soup = BeautifulSoup(data) #Setup a "soup" which BeautifulSoup can search

    links = []

    for link in soup.find_all('img'):  #Cycle through all 'img' tags
        imgSrc = link.get('src')   #Extract the 'src' from those tags
        links.append(imgSrc)    #Append the source to 'links'

    return links  #Return 'links'

@app.route('/<site>')
def page(site):
    image = getImages("http://" + site)[0] #Here I find the 1st image on the page
    if image[0] == "/":
        image = "http://" + site + image  #This creates a URL for the image
    return "<img src=%s></img>" % image  #Return the image in an HTML "img" tag

if __name__ == '__main__':
    app.run(debug=True, host="0.0.0.0")  #Run the Flask webserver

这将托管http://localhost:5000/

上的网络服务器

要输入网站,请执行http://localhost:5000/yoursitehere,例如http://localhost:5000/www.google.com