我正在处理几个网站,所以我有一个列表 图像的绝对路径,使用以下代码:
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"/>
答案 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]