Python 获取具有随机类名的元素

Python 获取具有随机类名的元素,python,selenium,web-scraping,Python,Selenium,Web Scraping,它看起来像的 通过这样说,我需要修复脚本并硬编码类ID,以便能够刮取网页 var=driver。通过类名称('FFVAD')查找元素。 有人告诉我,我可以使用img.get_属性('class')来查找类ID,并将其存储以备将来使用。但我仍然不明白这是如何实现的,因此selenium或soup可以从html标记中获取类ID,然后存储或解析它 我现在得到的只是这个。这有点脏,也不对,但想法就在那里 import requests import selenium.webdriver as webdr

它看起来像

通过这样说,我需要修复脚本并硬编码
类ID
,以便能够刮取网页

var=driver。通过类名称('FFVAD')查找元素。

有人告诉我,我可以使用
img.get_属性('class')
来查找
类ID
,并将其存储以备将来使用。但我仍然不明白这是如何实现的,因此selenium或soup可以从
html标记
中获取
类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个图像,我得到3个
类ID

python tag_print.py 
FFVAD
FFVAD
FFVAD

您当前正在按硬编码的类名搜索元素

如果类名是随机化的,则不能再对其进行硬编码。你必须:

  • 通过一些其他特征搜索元素(例如元素层次结构、一些其他属性等;XPath可以做到这一点)


    您当前正在按硬编码的类名搜索元素

    如果类名是随机化的,则不能再对其进行硬编码。你必须:

    • 通过一些其他特征搜索元素(例如元素层次结构、一些其他属性等;XPath可以做到这一点)


      因此,我设法使用(当然是在循环之外)获得它

      get\u img\u class=driver。通过类名称('img')[1]查找元素。get\u属性('class')


      就像那样,我能够解析
      类ID
      ,并将其存储起来供以后使用。非常感谢大家的帮助。所有想法都很好,值得以后使用

      所以我设法使用了它(当然是在循环之外)

      get\u img\u class=driver。通过类名称('img')[1]查找元素。get\u属性('class')


      就像那样,我能够解析
      类ID
      ,并将其存储起来供以后使用。非常感谢大家的帮助。所有想法都很好,值得以后使用

      Instagram需要注册才能访问任何内容,因此我无法给出具体示例。只有在检查元素时才能查看Instagram。无需注册或登录,因此也可以使用首页。这很重要。是的,你只需转到并查看档案中最长的所有内容即可使用
      alt=“Tag your best friend”
      查找图像,获取其类别,然后使用该类别搜索具有相同类别的其他元素。Instagram需要注册才能访问任何内容,所以我不能给出一个具体的例子。只有当你检查元素时才能看到它。无需注册或登录,因此也可以使用首页。这改变了问题。是的,你可以直接转到并查看所有内容,因为配置文件是公开的。使用
      alt=“Tag your best friend”
      查找图像,获取其类,然后使用该类搜索具有相同类的其他元素。关于第二点,看起来它唯一出现的地方是
      @ivan\u pozdeev非常感谢您的详细解释!我拿着它,把钱存起来notes@uzdisral请注意,SO上所有发布的内容都是CC-BY-SA。第二点,它看起来唯一出现的地方是
      @ivan_pozdeev非常感谢您的详细解释!我拿着它,把钱存起来notes@uzdisral请注意,SO上发布的所有内容都是CC-BY-SA。
      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")>]
      
      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")>]