python – 获取具有随机类名的元素
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 获取具有随机类名的元素,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5328字,纯文字阅读大概需要8分钟。
内容图文
![python – 获取具有随机类名的元素](/upload/InfoBanner/zyjiaocheng/708/f10a4ad7f331471d93532d60599c0271.jpg)
它看起来像< class id> for< img class>在Instagram的网页上每天都在变化.现在它是FFVAD,明天它将是其他东西.例如(我缩短了,链接很长):
< img class =“FFVAD”alt =“标记你最好的朋友”decoding =“auto”style =“”sizes =“293px”src =“https://scontent-lax3-2.cdninstagram.com/vp/0436c00a3ac9428b2b8c977b45abd022 /5BAB3EBC/t51.2885-15/s640x640/sh0.08/e35/33110483_592294374461447_8669459880035221504_n.jpg\"\u0026gt; 通过这样说,我需要修复脚本并对类ID进行硬编码,以便能够抓取网页. var = driver.find_elements_by_class_name(‘FFVAD’) 有人告诉我,我可以使用img.get_attribute(‘class’)来查找类ID并将其存储起来供以后使用.但是我仍然不明白如何实现这一点,所以selenium或者汤可以从html标签中获取Class ID并在以后存储或解析它. 我现在得到的就是这个.它有点脏,不对,但想法就在那里.
import requests
import selenium.webdriver as webdriver
url = ('https://www.instagram.com/kitties')
driver = webdriver.Firefox()
driver.get(url)
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
imgs_dedupe = driver.find_elements_by_class_name('FFVAD')
for img in imgs_dedupe:
posts = img.get_attribute('class')
print posts
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(scroll_delay)
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
当我运行它时,我得到这个输出,因为页面上有3个图像,我得到3x类ID
python tag_print.py
FFVAD
FFVAD
FFVAD
解决方法:
您当前正在通过硬编码的类名搜索元素.
如果类名是随机的,则不能再对其进行硬编码.你必须要么:
>通过其他一些特征搜索元素(例如元素层次结构,其他一些属性等; XPath可以做到这一点)
In [10]: driver.find_elements_by_xpath('//article//img')
Out[10]:
[<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1ab4eeb4-10c4-4da4-996c-ee6744445dcc", element="55c48964-8cd0-4472-b35b-214a5a9bfbf7")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1ab4eeb4-10c4-4da4-996c-ee6744445dcc", element="b7f7c8a4-e343-49ca-b416-49f72e67ae07")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1ab4eeb4-10c4-4da4-996c-ee6744445dcc", element="728f6148-6a03-4c9a-9933-36859d65eb51")>]
>您还可以按元素的视觉特征进行搜索:大小,可见性,位置.这不能完全由XPath完成,你必须得到所有< img>用手标记并用JS检查每一个.
(见下面的例子,因为它很长.)
>从其他页面逻辑以某种方式学习这个类名(如果页面的逻辑本身可以找到并使用它,它必须存在于其他地方,并且该逻辑必须由其他东西找到,等等)
在这种情况下,类名是renderImage函数中局部变量的一部分,因此它只能通过探索其AST来通过DOM进行挽救.函数本身被隐藏在webpack机器内部(它似乎将所有资源打包成一些具有单字母名称的全局对象).或者,您可以将所有包含的JS文件作为原始数据读取,并在其中查找renderImage的定义.因此,在这种情况下,虽然理论上可能仍然存在,但它不成比例地难以实现.
通过视觉特征获取元素的示例
在任何页面上,这将找到3个相同大小的图像,并排放置(这是它们在https://www.instagram.com/kitties的方式).
由于HTMLElements不能直接传递给Python(至少我找不到任何方法),我们需要传递一些唯一的ID来代替它们,就像独特的XPath一样.
(JS代码可能更优雅,我没有太多的语言经验)
In [22]: script = """
//https://stackoverflow.com/questions/2661818/javascript-get-xpath-of-a-node/43688599#43688599
function getXPathForElement(element) {
const idx = (sib, name) => sib
? idx(sib.previousElementSibling, name||sib.localName) + (sib.localName == name)
: 1;
const segs = elm => !elm || elm.nodeType !== 1
? ['']
: elm.id && document.querySelector(`#${elm.id}`) === elm
? [`id("${elm.id}")`]
: [...segs(elm.parentNode), `${elm.localName.toLowerCase()}[${idx(elm)}]`];
return segs(element).join('/');
}
//https://plainjs.com/javascript/styles/get-the-position-of-an-element-relative-to-the-document-24/
function offsetTop(el){
return window.pageYOffset + el.getBoundingClientRect().top;
}
var expected_images=3;
var found_groups=new Map();
for (e of document.getElementsByTagName('img')) {
let group_id = e.offsetWidth + "x" + e.offsetHeight;
if (!(found_groups.has(group_id))) found_groups.set(group_id,[]);
found_groups.get(group_id).push(e);
}
for ([k,v] of found_groups) {
if (v.length != expected_images) {found_groups.delete(k);continue;}
var offset_top = offsetTop(v[0]);
for (e of v){
let _c_oft = offsetTop(e);
if (_c_oft !== offset_top){
found_groups.delete(k);
break;
}
}
}
if (found_groups.size != 1) {
console.log(found_groups);
throw 'Unexpected pattern of images after filtering';
}
var found_group = found_groups.values().next().value;
result=[]
for (e of found_group) {
result.push(getXPathForElement(e));
}
return result;
"""
In [23]: d.execute_script(script)
Out[23]:
[u'id("react-root")/section[1]/main[1]/div[1]/article[1]/div[1]/div[1]/div[1]/div[1]/a[1]/div[1]/div[1]/img[1]',
u'id("react-root")/section[1]/main[1]/div[1]/article[1]/div[1]/div[1]/div[1]/div[2]/a[1]/div[1]/div[1]/img[1]',
u'id("react-root")/section[1]/main[1]/div[1]/article[1]/div[1]/div[1]/div[1]/div[3]/a[1]/div[1]/div[1]/img[1]']
In [27]: [d.find_element_by_xpath(xp) for xp in _]
Out[27]:
[<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1ab4eeb4-10c4-4da4-996c-ee6744445dcc", element="55c48964-8cd0-4472-b35b-214a5a9bfbf7")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1ab4eeb4-10c4-4da4-996c-ee6744445dcc", element="b7f7c8a4-e343-49ca-b416-49f72e67ae07")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1ab4eeb4-10c4-4da4-996c-ee6744445dcc", element="728f6148-6a03-4c9a-9933-36859d65eb51")>]
内容总结
以上是互联网集市为您收集整理的python – 获取具有随机类名的元素全部内容,希望文章能够帮你解决python – 获取具有随机类名的元素所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。