如何在类“img”中获取标签“src”的内容?
Posted
技术标签:
【中文标题】如何在类“img”中获取标签“src”的内容?【英文标题】:How to get content of tag 'src' inside class `img`? 【发布时间】:2021-06-02 10:13:59 【问题描述】:我想从这些元素中提取标签src
的内容
<div class="img-placeholder" style="padding-bottom:57.9%;">
<img data-srcset="abc.png" src="abc.png" data-placeholder="blurry" class=" lazyloaded" data-click-tracked="true" data-img-lightbox="true" data-owner="" data-caption="TradingView" data-expand="300" id="mntl-sc-block-image_1-0-5" data-tracking-container="true" srcset="abc.png 1541w">
</div>
我尝试了[tag.attrs['src'] for tag in soup.select('img')]
,但它返回错误KeyError: 'src'
。您能否详细说明为什么它不起作用以及如何解决?
import requests
session = requests.Session()
from bs4 import BeautifulSoup
import os
l = 'https://www.investopedia.com/terms/k/kijun-line.asp'
headers = 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0'
r = session.get(l, headers = headers)
soup = BeautifulSoup(r.content, 'html.parser')
temp4 = [tag.attrs['src'] for tag in soup.select('img')]
temp4
更新:我改成
[tag.attrs['src'] for tag in soup.select('div.img-placeholder img') if 'src' in tag.attrs]
但结果并不如预期,即
['data:image/gif;charset=utf-8;base64,R0lGODlhCwAGAPIAAHNzdWulg+Xy5f/l5f///3NzdXNzdXNzdSwAAAAACwAGAEIIGwAJCBxIsKDBgwIGBiAI4CABAAMGJAwQ0SHBgAA7',
'data:image/gif;charset=utf-8;base64,R0lGODlhCgAGAPIAABisoH+O0f2zcoGRz7a/4LfA4ejp7fDw8iwAAAAACgAGAEIIIQANHBhIcKCBAQULGhCYkMCBhQkHFhDAEMCBAAQhRnwYEAA7']
例如,满足条件的元素之一是
更新:我改为selenium
。奇怪的是,我只能得到 2 个令人满意的元素中的一个。我的代码是
import requests
session = requests.Session()
from bs4 import BeautifulSoup
import os, time
from selenium import webdriver
driver = webdriver.Chrome('C:\\Users\\Akira\\Downloads\\Compressed\\chromedriver.exe')
l = 'https://www.investopedia.com/terms/k/kijun-line.asp'
driver.get(l)
time.sleep(10)
text = driver.page_source
soup = BeautifulSoup(text, 'html.parser')
temp4 = [tag.attrs['src'] for tag in soup.select('div.img-placeholder img') if 'src' in tag.attrs]
temp4
结果是
['https://www.investopedia.com/thmb/LbG-nFJad_8ednnDsr-fD7Uvcb8=/1541x893/filters:no_upscale():max_bytes(150000):strip_icc():format(webp)/Kijun-Sen-3b696ff097264a429b780a98afeb5cbe.png',
'data:image/gif;charset=utf-8;base64,R0lGODlhCgAGAPIAABisoH+O0f2zcoGRz7a/4LfA4ejp7fDw8iwAAAAACgAGAEIIIQANHBhIcKCBAQULGhCYkMCBhQkHFhDAEMCBAAQhRnwYEAA7']
【问题讨论】:
@RishabhKumar 我还要求澄清为什么我的代码不起作用。 似乎不是所有的img
标签都有src
属性:[tag.attrs['src'] for tag in soup.select('img') if 'src' in tag.attrs]
好吧,如果你真的不想要带有src="data:"
的图像,那么你可以过滤掉它们。如果这是收集所有这些图像标签的全部意义,您可以使用 python 对它们进行解码并获取保存在您机器上的实际图像文件。
忙,但您可以尝试复制浏览器在手动浏览时发送的所有请求标头和 cookie。我对请求的尝试返回两个带有data:...
的图像。我对 selenium 的尝试只返回一张带有 data:...
的图像。
您期待两个网址吗?它们是什么?
【参考方案1】:
你想要 data-src 属性而不是 src
import requests
from bs4 import BeautifulSoup as bs
r = requests.get('https://www.investopedia.com/terms/k/kijun-line.asp')
soup = bs(r.content, 'lxml')
print([i['data-src'] for i in soup.select('.img-placeholder img')])
【讨论】:
它工作得很好。无论如何要捕获属性src
内的链接?
它在响应中与页面上不完全相同。您可以从 data-srcset 中过滤/正则表达式删除相同的分辨率 url
我只是好奇是否有一些技术可以提取属性src
的内容。我的意思是当我在 Google Chrome 中右键单击图像并Inspect
时看到的内容?
我认为它是通过 javascript 生成的,所以你可以使用 selenium?
我认为它是在这个脚本https://www.investopedia.com/static/1.139.0/cache/eNqNU0FywzAI_FA1ekSvvfUFSMYONZZShOo4ry9xkjbjKGlnPAbWuxgE8kVBKXqmUPyHPZ8VZXnxF9iQqsSkhMWFSqxuJt25De2qZjguhY5YbhNMSfk9Smb-QWOe9jlh0uIpKUoC9h32KCf-6gh2LTb0vVUDio4pjU5wFtKz7MGnVhY8nP9pla7ktfY7sKUcLf_h_G6W162pTr3CDMsTSs94oMDooNlngi8aDMzJ7xA6FGfIjfuHJogxo9QplFW4iZt1iQGMV-smVPBhsZPAi2mpZuoGNKs5s9L-alvUolKjVhusi9mGnnTdmBxHF4g5ZJCu_FNIEwzoo3Wl-EbDTkM-vILkWpDvlrJYMC5uJH0yj9PmPpjF9mRKrhKxbONnxwOdU7Bpr3t68f8YoS3jZFcO5Nf7BqcoaTY.min.js:formatted
和function h(e, t)
中生成的以上是关于如何在类“img”中获取标签“src”的内容?的主要内容,如果未能解决你的问题,请参考以下文章