【问题标题】:How to extract the text ignoring the nested tag where i need the text in <td> but not in nested <strong>如何在忽略嵌套标签的情况下提取文本,其中我需要 <td> 中的文本但不需要嵌套 <strong>
【发布时间】:2018-12-07 03:42:20
【问题描述】:

我想在下面的代码中忽略 &lt;td&gt; 中的嵌套标签。 我只想要&lt;td&gt; 中的整数(数字)而不是&lt;strong&gt; 标签中包含的文本。 我已经编写了 selenium 代码,但它在 &lt;td&gt;. 中返回了整个文本 有什么方法可以让我忽略嵌套并获取&lt;td&gt;中的数字

Python 代码:

 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#middle > table > tbody > tr:nth-child(2) > td:nth-child(1) > table > tbody > tr:nth-child(1) > td')))
 data = driver.find_elements_by_css_selector("#middle > table > tbody > tr:nth-child(2) > td:nth-child(1) > table > tbody > tr:nth-child(1) > td")
    print(data[0].text)

输出:: 包裹号 71200000

但我只想要71200000

HTML:

<table width="100%">
    <tbody>
        <tr style="">
            <td><strong>Parcel Number</strong> 71200000</td>
        </tr>
        <tr style="">
            <td><strong>Tax Area</strong> 19A - TAX DISTRICT 19A</td>
        </tr>
        <tr style="">
            <td><strong>Situs Address</strong> </td>
        </tr>
        <tr style="">
            <td><strong>Legal Summary</strong> W.H.M. SECTION A BLK 1 LOT 1 CONT. 7.14 AC</td>
        </tr>
    </tbody>
</table>

【问题讨论】:

  • 您可以应用正则表达式来提取数字。
  • 但对于其他 我不能应用正则表达式。例如 税区 19A - TAX DISTRICT 19A 在此我需要:19A - 仅限 TAX DISTRICT 19A
  • 你将不得不处理你得到的文本。我可以用 java 提供,但似乎你需要用 Python。

标签: python html selenium web-scraping css-selectors


【解决方案1】:

以下代码可能对您有所帮助。

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#middle > table > tbody > tr:nth-child(2) > td:nth-child(1) > table > tbody > tr:nth-child(1) > td')))
    data = driver.find_elements_by_css_selector("#middle > table > tbody > tr:nth-child(2) > td:nth-child(1) > table > tbody > tr:nth-child(1) > td")
    print(data[0].text)
    data_child = data[0].find_element_by_tag_name("strong")
    data_parent = data[0].text.replace(data_child.text,'')
    print(data_parent)

【讨论】:

    【解决方案2】:

    在 Java 中,您可以执行以下操作 -

    data.substring(data.indexOf("</strong>")+"</strong>".length(), data .length()));
    

    也许你可以转换它:)

    【讨论】:

      【解决方案3】:

      使用正则表达式。

      import re
      output = "Parcel Number 71200000"
      m = re.search(r"\d+", output)
      if m:
          print(m.group())
      

      输出:

      71200000
      

      【讨论】:

        【解决方案4】:

        您可以使用decompose函数将&lt;strong&gt;标签中的文本删除,只获取&lt;td&gt;标签中的文本。

        content = BeautifulSoup(yourhtml, 'html.parser')
        tds = content.find_all('td')
        tds[0].find("strong").decompose()
        print(tds[0].text.strip())
        

        输出: 71200000

        【讨论】:

          【解决方案5】:

          要提取所需的文本,您还可以使用 Python 的 split() 方法,如下所示:

          all_data = WebDriverWait(driver, 20).until.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#middle > table > tbody > tr:nth-child(2) > td:nth-child(1) > table > tbody > tr:nth-child(1) > td')))
          for data in all_data:
              print(data.text.split(">")[2]) 
          

          【讨论】:

          • 中的整个文本,它没有忽略“强”标签
          • AttributeError: 'list' 对象没有属性 'split'
          • @curious_nustian 查看我的更新答案并告诉我状态
          猜你喜欢
          相关资源
          最近更新 更多
          热门标签