获取图像的绝对路径而不是blank.gif

时间:2017-06-02 18:47:19

标签: python beautifulsoup bs4

我正在处理几个网站,所以我有一个列表 图像的绝对路径,使用以下代码:

for img in images:
    try:
      if img["src"].startswith("http"):
        abs_img_url = img["src"]
      else:
        abs_img_url = urljoin(url, img["src"])
    except KeyError:
      # src attribute does not exist
      continue

问题在于这个webpage,我将获得大量blank.gif图像,但浏览器将显示存储在其中的其他文件 img["data-original"]属性。 Firefox检查员对此感到惊讶 在img["src"]中显示正确的图像,但是当您查看源时 你在img["data-original"]中看到了它。

你能解释一下这个问题吗?你会如何对待它? 检测并下载正确的图像,而不是blank.gif

示例图像元素给出错误结果:

<img alt="browser cache backend" class="lazy aligncenter size-full wp-image-57323" data-original="http://11986-presscdn-0-77.pagely.netdna-cdn.com/wp-content/uploads/2008/06/browser-cache-backend.jpg" height="190" itemprop="image" sizes="(max-width: 540px) 100vw, 540px" src="http://11986-presscdn-0-77.pagely.netdna-cdn.com/wp-content/themes/online-tech-tips-2013/images/blank.gif" srcset="http://11986-presscdn-0-77.pagely.netdna-cdn.com/wp-content/uploads/2008/06/browser-cache-backend.jpg 540w, http://11986-presscdn-0-77.pagely.netdna-cdn.com/wp-content/uploads/2008/06/browser-cache-backend-300x106.jpg 300w, http://11986-presscdn-0-77.pagely.netdna-cdn.com/wp-content/uploads/2008/06/browser-cache-backend-80x28.jpg 80w" width="540"/>

2 个答案:

答案 0 :(得分:1)

如果图像被称为blank.gif:

,请尝试添加条件来检测
for img in images:
    try:
        if img["src"].startswith("http"):

        abs_img_url = img["src"]

        if img["src"][-9:]=='blank.gif':
            abs_img_url = img["data-original"]
      else:
        abs_img_url = urljoin(url, img["src"])
    except KeyError:
        # src attribute does not exist
        continue

答案 1 :(得分:1)

问题是JavaScript在加载时动态地将源从data-original属性更改为src属性,并且由于BeautifulSoup不处理JS,因此最终会出现无效的src属性对你的图像。考虑到这一点,您有两个选项,要么解析data-original属性,要么在解析Selenium或CasperJS或PhantomJS等页面之前将方法更改为处理JS代码的方法。

我认为搜索正确的属性是一种很好的方法,可以避免过度复杂的刮刀。

my_images = []

for img in images:
    try:
        if img['src'].endswith('blank.gif'):
            my_images.append(img['data-original'])
        else:
            my_images.append(img['src'])
    except KeyError:
        continue

my_abs_images = [img if img.startswith('http') else urljoin(url, img) for img in my_images]