代码之家  ›  专栏  ›  技术社区  ›  buzz

在HTML文本中查找元素-Selenium Python

  •  0
  • buzz  · 技术社区  · 2 年前

    我正试图通过简单或 innerHTML 文本

    newresults = driver.find_elements("xpath","//*[@class='card is-category-product']")    
    for result in newresults:
        htmlEl = result.get_attribute('innerHTML')
    

    所以基本上我想在我的htmlEl变量中搜索
    htmlEl 按如下方式返回每个块:

    <figure class="card-figure card-link">
        <picture class="card-picture ratio ratio-4x3">
            <source srcset="url-to-image">
            <source srcset="url-to-image"> <img src="url-to-image" class="card-img object-fit-contain is-contain" loading="lazy" alt="image-alt"> </picture>
        <figcaption class="card-caption">
            <h3 class="mb-0">TITLE OF CARD</h3>
            <p class="small">Random text</p>
        </figcaption>
        <a href="/random-url" class="card-link-overlay" title="TITLE" aria-label="title"></a>
    </figure>
    

    例如,我想找到类为“mb-0”的H3元素,该元素应该返回-TITLE OF CARD。我试过了

    foundname = driver.find_element(By.XPATH, "//h3[@class='mb-0']")
    

    但很明显,这是在我指定的原始URL中搜索的,而不是在我的 htmlEl 变量

    2 回复  |  直到 2 年前
        1
  •  1
  •   JeffC    2 年前

    您不想搜索元素的“innerHTML”,因为这会以文本形式返回实际的HTML,因为它位于页面的DOM中。这意味着您需要解析HTML等。Selenium可以更容易地处理这种情况。

    你需要的是 .find_element() 呼叫,例如。

    newresults = driver.find_elements(By.XPATH, "//*[@class='card is-category-product']")    
    for result in newresults:
        htmlEl = result.find_element(By.XPATH, ".//h3[@class='mb-0']")
                 ^^^^^^ we start from result
    

    因为我们正在链接.find_element()调用并使用XPath,所以需要添加一个。(点)位于内部XPath的开头

    .//h3[@class='mb-0']
    ^ add a dot here
    

    指示要从元素中搜索 result .

    注意:如果您正在使用 任何其他定位器类型 ,例如CSS选择器、ID等。您不需要添加此点。例如,使用CSS选择器的相同代码将是

    newresults = driver.find_elements(By.CSS_SELECTOR, ".card.is-category-product")    
    for result in newresults:
        htmlEl = result.find_element(By.CSS_SELECTOR, "h3.mb-0")
    

    注:中的点 h3.mb-0 表示一个类“mb-0”,与上下文无关,等等。

    我更喜欢CSS选择器而不是XPath,原因有很多。。。

    1. 它们更快
    2. 他们有更好的浏览器支持
    3. 语法更短、更简单、更易于阅读

    XPaths有自己的位置。。。

    1. 它们是唯一可以通过包含的文本定位元素的定位器
    2. 它们是唯一可以执行复杂DOM遍历的定位器

    我只是尽可能使用CSS选择器。。。直到我 使用XPath。

        2
  •  -1
  •   Dan Nagle    2 年前

    您可以对结果进行迭代,并在每个结果中进行搜索。

    newresults = driver.find_elements(By.XPATH, "//figure[contains(@class, 'card-figure') and contains(@class, 'card-link')]")
    
    for result in newresults:
        h3_tag = result.find_element(By.XPATH, ".//h3[contains(@class, 'mb-0')]")
        print(h3_tag.text)