首页 > 解决方案 > 如何使用 selenium 和 python 在 `::before` 部分中获取文本?

问题描述

我想访问课后存储::before的文本。variant__available-qty在示例中为“14”。

当我尝试:

variants = driver.find_elements_by_class_name("variant__available-qty")

或者

variants = driver.find_elements_by_class_name("variants__container-item")

它以一个空列表作为响应,尽管应该至少有三个元素。我尝试执行一些 JS 脚本(driver.execute_script(...))但没有成功。

<div class="variants__container">
   <div class="variants__container-headers">
      <div class="variants__header--item">Rozmiar</div>
      <div class="variants__header--qty">Wybierz ilość</div>
   </div>
   <div class="variants__container-items">
      <div id="variant__70224" class="variants__container-item">
         <div class="variant__price">
            <div class="price">71.27&nbsp;zł</div>
         </div>
         <div class="variant__item">
            <div class="variant__attributes">35-37 </div>
            <div class="variant__sku">610306143389</div>
         </div>
         <div class="variant__qty">
            <form method="post" action="https://b2b.snapoutdoor.pl/checkout/cart/add/uenc/aHR0cHM6Ly9iMmIuc25hcG91dGRvb3IucGwvL3Jlc3QvVjEvZXh0ZW5kdmFyaWFudHN0b2NhcnQvODY1NDY_Xz0xNjAyMzE4NzI4Nzcz/product/86546/">
               <div class="qty">
                  <div class="qty-down">-</div>
                  <input type="number" name="qty" data-productid="70224" onfocus="this.value=''" value="0" min="0">
                  <div class="qty-up">+</div>
               </div>
               <input type="hidden" name="super_attribute[233]" value="2028"><input type="hidden" name="form_key" value="OPk3fByYxbAMTgnu"><button disabled="" class="add-to-cart action primary" type="submit">Do koszyka</button>
            </form>
         </div>
         <div class="variant__available-qty">12</div>
      </div>
      <div id="variant__70225" class="variants__container-item">
         <div class="variant__price">
            <div class="price">71.27&nbsp;zł</div>
         </div>
         <div class="variant__item">
            <div class="variant__attributes">38-40 </div>
            <div class="variant__sku">610306143396</div>
         </div>
         <div class="variant__qty">
            <form method="post" action="https://b2b.snapoutdoor.pl/checkout/cart/add/uenc/aHR0cHM6Ly9iMmIuc25hcG91dGRvb3IucGwvL3Jlc3QvVjEvZXh0ZW5kdmFyaWFudHN0b2NhcnQvODY1NDY_Xz0xNjAyMzE4NzI4Nzcz/product/86546/">
               <div class="qty">
                  <div class="qty-down">-</div>
                  <input type="number" name="qty" data-productid="70225" onfocus="this.value=''" value="0" min="0">
                  <div class="qty-up">+</div>
               </div>
               <input type="hidden" name="super_attribute[233]" value="2036"><input type="hidden" name="form_key" value="OPk3fByYxbAMTgnu"><button disabled="" class="add-to-cart action primary" type="submit">Do koszyka</button>
            </form>
         </div>
         <div class="variant__available-qty">14</div>
      </div>
      <div id="variant__70226" class="variants__container-item">
         <div class="variant__price">
            <div class="price">71.27&nbsp;zł</div>
         </div>
         <div class="variant__item">
            <div class="variant__attributes">41-43 </div>
            <div class="variant__sku">610306143402</div>
         </div>
         <div class="variant__qty">
            <form method="post" action="https://b2b.snapoutdoor.pl/checkout/cart/add/uenc/aHR0cHM6Ly9iMmIuc25hcG91dGRvb3IucGwvL3Jlc3QvVjEvZXh0ZW5kdmFyaWFudHN0b2NhcnQvODY1NDY_Xz0xNjAyMzE4NzI4Nzcz/product/86546/">
               <div class="qty">
                  <div class="qty-down">-</div>
                  <input type="number" name="qty" data-productid="70226" onfocus="this.value=''" value="0" min="0">
                  <div class="qty-up">+</div>
               </div>
               <input type="hidden" name="super_attribute[233]" value="2042"><input type="hidden" name="form_key" value="OPk3fByYxbAMTgnu"><button disabled="" class="add-to-cart action primary" type="submit">Do koszyka</button>
            </form>
         </div>
         <div class="variant__available-qty">6</div>
      </div>
   </div>
</div>

在此处输入图像描述

标签: python-3.xseleniumselenium-webdriverweb-scraping

解决方案


你可以简单地使用BeautifulSoup这个:

from bs4 import BeautifulSoup

html = """
<div class="variants__container">
   <div class="variants__container-headers">
      <div class="variants__header--item">Rozmiar</div>
      <div class="variants__header--qty">Wybierz ilość</div>
   </div>
   <div class="variants__container-items">
      <div id="variant__70224" class="variants__container-item">
         <div class="variant__price">
            <div class="price">71.27&nbsp;zł</div>
         </div>
         <div class="variant__item">
            <div class="variant__attributes">35-37 </div>
            <div class="variant__sku">610306143389</div>
         </div>
         <div class="variant__qty">
            <form method="post" action="https://b2b.snapoutdoor.pl/checkout/cart/add/uenc/aHR0cHM6Ly9iMmIuc25hcG91dGRvb3IucGwvL3Jlc3QvVjEvZXh0ZW5kdmFyaWFudHN0b2NhcnQvODY1NDY_Xz0xNjAyMzE4NzI4Nzcz/product/86546/">
               <div class="qty">
                  <div class="qty-down">-</div>
                  <input type="number" name="qty" data-productid="70224" onfocus="this.value=''" value="0" min="0">
                  <div class="qty-up">+</div>
               </div>
               <input type="hidden" name="super_attribute[233]" value="2028"><input type="hidden" name="form_key" value="OPk3fByYxbAMTgnu"><button disabled="" class="add-to-cart action primary" type="submit">Do koszyka</button>
            </form>
         </div>
         <div class="variant__available-qty">12</div>
      </div>
      <div id="variant__70225" class="variants__container-item">
         <div class="variant__price">
            <div class="price">71.27&nbsp;zł</div>
         </div>
         <div class="variant__item">
            <div class="variant__attributes">38-40 </div>
            <div class="variant__sku">610306143396</div>
         </div>
         <div class="variant__qty">
            <form method="post" action="https://b2b.snapoutdoor.pl/checkout/cart/add/uenc/aHR0cHM6Ly9iMmIuc25hcG91dGRvb3IucGwvL3Jlc3QvVjEvZXh0ZW5kdmFyaWFudHN0b2NhcnQvODY1NDY_Xz0xNjAyMzE4NzI4Nzcz/product/86546/">
               <div class="qty">
                  <div class="qty-down">-</div>
                  <input type="number" name="qty" data-productid="70225" onfocus="this.value=''" value="0" min="0">
                  <div class="qty-up">+</div>
               </div>
               <input type="hidden" name="super_attribute[233]" value="2036"><input type="hidden" name="form_key" value="OPk3fByYxbAMTgnu"><button disabled="" class="add-to-cart action primary" type="submit">Do koszyka</button>
            </form>
         </div>
         <div class="variant__available-qty">14</div>
      </div>
      <div id="variant__70226" class="variants__container-item">
         <div class="variant__price">
            <div class="price">71.27&nbsp;zł</div>
         </div>
         <div class="variant__item">
            <div class="variant__attributes">41-43 </div>
            <div class="variant__sku">610306143402</div>
         </div>
         <div class="variant__qty">
            <form method="post" action="https://b2b.snapoutdoor.pl/checkout/cart/add/uenc/aHR0cHM6Ly9iMmIuc25hcG91dGRvb3IucGwvL3Jlc3QvVjEvZXh0ZW5kdmFyaWFudHN0b2NhcnQvODY1NDY_Xz0xNjAyMzE4NzI4Nzcz/product/86546/">
               <div class="qty">
                  <div class="qty-down">-</div>
                  <input type="number" name="qty" data-productid="70226" onfocus="this.value=''" value="0" min="0">
                  <div class="qty-up">+</div>
               </div>
               <input type="hidden" name="super_attribute[233]" value="2042"><input type="hidden" name="form_key" value="OPk3fByYxbAMTgnu"><button disabled="" class="add-to-cart action primary" type="submit">Do koszyka</button>
            </form>
         </div>
         <div class="variant__available-qty">6</div>
      </div>
   </div>
</div>
""" # The html code
soup = BeautifulSoup(html,'html5lib')

divs = soup.find_all('div',class_ = 'variant__available-qty')

for div in divs:
    print(div.text)

输出:

12
14
6

就我而言,我已经对 html 进行了硬编码。但是您可以使用 .提取网页的 html 代码driver.page_source。然后您可以将该 html 转换为BeautifulSoup对象并执行这些操作。如果您仍想使用 selenium,请尝试使用xpathsorcss selectors代替class_names. 希望这会有所帮助!


推荐阅读