【问题标题】:Trying to get following element (text) without class tag etc试图在没有类标签等的情况下获取以下元素(文本)
【发布时间】:2022-01-10 09:35:43
【问题描述】:

这是我要解析的页面的 html 代码。 (这是一家书店) Part of the page code

<tr><tr>
<tr><tr>
<tr><tr>
<tr><tr>
<tr><tr>
<tr>
    <td width="300" class="highlight">
        <b>Издатель:</b>
         Додо Пресс,Фантом Пресс 
    </td>
</tr>
<tr><tr>
<tr><tr>
<tr><tr>

我需要获取以下文本

&lt;b&gt;Издатель:&lt;/b&gt;(翻译 - 发布者)

首先我使用了来自 BeautifulSoup 的nextsibling,它工作得很好,但是在同一站点上的其他书籍页面上,出版商元素并不总是在同一个地方,这意味着我的下一个兄弟姐妹链没有得到正确的部分书的描述。

我试图用 Selenium 找到确切的文本“Издатель:”

pubs = driver.find_element(By.XPATH, "//*[text()='Издатель:']")

它完成了这项工作。我收到了文本“Издатель:”。之后,我尝试在“Издатель:”之后找到下一个元素,因为我需要的文本始终位于“Издатель:”之后。

followingsibling 表单 Selenium 不起作用,因为发布者的名称没有类或标签等。

我也试过运行 JS

pubs = driver.find_element(By.XPATH, "//*[text()='Издатель:']")
pub = driver.execute_script("""
    return arguments[0].nextElement""", pubs)
pub = driver.execute_script("return document.evaluate('// [text()='Издатель:']/following-sibling::text()[1]'), document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue.textContent;")

也没有用。

Publisher 元素没有任何兄弟元素或子元素,所以我不知道如何获取它后面的文本。

网站网址 - https://www.bgshop.ru/Catalog/GetFullDescription?id=10652263&type=1

【问题讨论】:

  • 那么您想要 Dodo Press、Phantom Press 吗?尝试像 //td[.//b[.='Издатель:']]/text() 作为 xpath。
  • @ArundeepChohan 是的。没错
  • 正如您提到的 Издатель:(翻译 - 出版商),您正在寻找的其他元素(英文)是什么?
  • @ArundeepChohan 我收到此错误 selenium.common.exceptions.InvalidSelectorException:消息:无效选择器:xpath 表达式的结果“//td[.//b[.='Издатель:'] ]/text()" 是:[对象文本]。它应该是一个元素。
  • 你想要Додо Пресс,Фантом Пресс

标签: javascript python html selenium parsing


【解决方案1】:

文本 Додо Пресс,Фантом Пресс 位于 文本节点 中,因此您必须使用 execute_script() 来诱导 WebDriverWait element_to_be_clickable() 和您可以使用以下任一Locator Strategies

  • 代码块:

    driver.get("https://www.bgshop.ru/Catalog/GetFullDescription?id=10652263&type=1")
    WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.collapsed"))).click()
    print(driver.execute_script('return arguments[0].lastChild.textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//*[text()='Издатель:']//ancestor::td[1]")))).strip())
    driver.quit()
    
  • 控制台输出:

    Додо Пресс,Фантом Пресс
    

参考文献

您可以在以下位置找到一些相关的详细讨论:

【讨论】:

  • //td[.//b[.='Издатель:']] 是一个 td,其中包含带有文本的 ab 我认为用文本编写祖先是一种更无错误的方式。
  • @ArundeepChohan 是的,另一种可能的方法。但我仍然觉得包含 B 的 TD 包含一个文本将是一种昂贵的算法,可以通过 ancestor 轻松优化:)
【解决方案2】:

您可以使用下面的 javascript 代码实现此目的。您可以选择每个b 元素,然后获取其父元素并访问innerText 属性

document.querySelectorAll('b').forEach( element => {
  console.log(element.parentElement.innerText)
})
<table>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr>
      <td width="300" class="highlight">
          <b>Publisher:</b>
          name 1
      </td>
  </tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr>
      <td width="300" class="highlight">
          <b>Publisher:</b>
          name 2 
      </td>
  </tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr>
      <td width="300" class="highlight">
          <b>Publisher:</b>
           name 3 
      </td>
  </tr>
</table>

如果还有其他b标签,那么你可以用if语句检查b的内容是否是下面的发布者谎言

document.querySelectorAll('b').forEach( element => {
  if(element.innerText == 'Publisher:'){
    console.log(element.parentElement.innerText);
  }
})
<table>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr>
      <td width="300" class="highlight">
          <b>Publisher:</b>
          name 1
      </td>
  </tr>
  <tr></tr>
  <tr>
      <td width="300" class="highlight">
          <b>Date:</b>
          Date 1
      </td>
  </tr>
  <tr></tr>
  <tr></tr>
  <tr>
      <td width="300" class="highlight">
          <b>Publisher:</b>
          name 2 
      </td>
  </tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr>
      <td width="300" class="highlight">
          <b>Publisher:</b>
           name 3 
      </td>
  </tr>
</table>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2013-05-19
    • 2014-06-23
    • 2020-11-23
    相关资源
    最近更新 更多