获取图像的绝对路径而不是 blank.gif
Get absolute paths to images instead of blank.gif
我正在处理一些网站,所以我有一个列表
图片的绝对路径,代码如下:
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"/>
尝试添加一个条件来检测图像是否被调用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
问题是 JavaScript 在加载时动态地将源从 data-original
属性更改为 src
属性,并且由于 BeautifulSoup 不处理 JS 你最终导致图像的 src
属性无效。考虑到这一点,您有 2 个选择,要么解析 data-original
属性,要么在解析页面之前更改您的方法来处理 JS 代码,例如 Selenium 或 CasperJS 或 PhantomJS。
我认为搜索正确的属性是一个很好的方法,不会让你的抓取工具过于复杂。
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]
我正在处理一些网站,所以我有一个列表 图片的绝对路径,代码如下:
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"/>
尝试添加一个条件来检测图像是否被调用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
问题是 JavaScript 在加载时动态地将源从 data-original
属性更改为 src
属性,并且由于 BeautifulSoup 不处理 JS 你最终导致图像的 src
属性无效。考虑到这一点,您有 2 个选择,要么解析 data-original
属性,要么在解析页面之前更改您的方法来处理 JS 代码,例如 Selenium 或 CasperJS 或 PhantomJS。
我认为搜索正确的属性是一个很好的方法,不会让你的抓取工具过于复杂。
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]