【问题标题】:Extracting image src based on attribute with BeautifulSoup使用 BeautifulSoup 基于属性提取图像 src
【发布时间】:2013-08-20 16:52:01
【问题描述】:

我正在使用 BeautifulSoup 从 IMDb 获取 HTML 页面,我想从页面中提取海报图像。我已经获得了基于其中一个属性的图像,但我不知道如何提取其中的数据。

这是我的代码:

url = 'http://www.imdb.com/title/tt%s/' % (id)
soup = BeautifulSoup(urllib2.urlopen(url).read())
print("before FOR")
for src in soup.find(itemprop="image"): 
    print("inside FOR")
    print(link.get('src'))

【问题讨论】:

    标签: python html-parsing web-scraping beautifulsoup


    【解决方案1】:

    你快到了 - 只是几个错误。 soup.find() 获取匹配的第一个元素,而不是列表,因此您无需遍历它。获得元素后,您可以使用字典访问来获取其属性(如src)。这是一个重新设计的版本:

    film_id = '0423409'
    url = 'http://www.imdb.com/title/tt%s/' % (film_id)
    soup = BeautifulSoup(urllib2.urlopen(url).read())
    link = soup.find(itemprop="image")
    print(link["src"])
    # output:
    http://ia.media-imdb.com/images/M/MV5BMTg2ODMwNTY3NV5BMl5BanBnXkFtZTcwMzczNjEzMQ@@._V1_SY317_CR0,0,214,317_.jpg
    

    我已将id 更改为film_id,因为id() 是一个内置函数,屏蔽它们是不好的做法。

    【讨论】:

      【解决方案2】:

      我相信你的例子非常接近。您需要使用 findAll() 而不是 find() 并且当您迭代时,您从 src 切换到链接。在下面的示例中,我将其切换为 tag

      此代码适用于 BeautifulSoup4:

      url = 'http://www.imdb.com/title/tt%s/' % (id,)
      soup = BeautifulSoup(urllib2.urlopen(url).read())
      print "before FOR"
      for tag in soup.findAll(itemprop="image"): 
          print "inside FOR"
          print(tag['src'])
      

      【讨论】:

        【解决方案3】:

        如果我理解正确,您正在寻找图像的 src,然后提取它。

        首先,您需要(使用检查器)找到图像在 HTML 中的哪个位置。例如,在我正在报废足球队盾牌的粒子案例中,我需要:

        m_url = 'http://www.marca.com/futbol/primera/equipos.html'
        client = uOpen(m_url) 
        page = client.read()
        client.close()
        
        page_soup = BS(page, 'html.parser')
        
        teams = page_soup.findAll('li', {'id': 'nombreEquipo'})
        for team in teams:
          name = team.h2.text
          shield_url = team.img['src']
        

        然后,您需要处理图像。你必须选择。

        第一个:使用 numpy

        def url_to_image(url):
            '''
            Función para extraer una imagen de una URL
            '''
            resp = uOpen(url)
            image = np.asarray(bytearray(resp.read()), dtype='uint8')
            image = cv2.imdecode(image, cv2.IMREAD_COLOR)
            return image
        

        屏蔽 = url_to_image(shield_url)

        第二次使用 scikit-image 库(您可能需要安装):

        shield = io.imread('http:' + shield_url)
        

        注意:在这个特殊的例子中,我需要在开头添加 http:。

        希望对你有帮助!

        【讨论】:

          【解决方案4】:

          这是一个完整的工作示例,gazpacho

          第 1 步 - 导入所有内容并下载 html:

          from pathlib import Path
          from urllib.request import urlretrieve as download
          from gazpacho import Soup
          
          id = 'tt5057054'
          url = f"https://www.imdb.com/title/{id}"
          
          soup = Soup.get(url)
          

          第 2 步 - 找到图片资源的 src url:

          image = (soup
              .find("div", {"id": "title-overview"})
              .find("div", {"class": "poster"})
              .find("img")
              .attrs['src']
          )
          

          第 3 步 - 将其保存到您的机器上:

          directory = "images"
          Path(directory).mkdir(exist_ok=True)
          
          extension = image.split('.')[-1]
          download(image, f"{directory}/{id}.{extension}")
          

          【讨论】:

            猜你喜欢
            • 2018-07-18
            • 2017-10-14
            • 1970-01-01
            • 2021-07-27
            • 1970-01-01
            • 2013-04-06
            • 2021-03-26
            • 2020-10-17
            • 2011-02-06
            相关资源
            最近更新 更多