如何使用Selenium Webdriver和Python从没有属性的工具提示中获取文本?

时间:2017-04-12 22:01:44

标签: python selenium selenium-webdriver

我有一个带有工具提示的web元素,显示以下消息: ●客户账面收入$ 20,966,618

该工具提示的HTML代码如下。我能够使用Selenium Webdriver将鼠标悬停在web元素上,这使得工具提示可见,但我无法弄清楚如何从中获取文本。有人可以帮忙吗?

<div class="highcharts-tooltip" style="position: absolute; left: 755px; top: 0px; display: block; opacity: 1; pointer-events: none; visibility: visible;">
    <span style="position: absolute; font-family: "Roboto",sans-serif; font-size: 12px; white-space: nowrap; color: rgb(51, 51, 51); margin-left: 0px; margin-top: 0px; left: 0px; top: 0px;">
        <div class="client-rate-bench-chart">
            <table class="table rdo-table-tooltip">
                <tbody>
                    <tr>
                        <td>
                            <span style="color:rgba(45,108,162,1)">●</span>
                           Client Book Revenue
                        </td>
                        <td> $20,966,618 </td>
                    </tr>
                </tbody>
           </table>
        </div>
    </span>
</div>

2 个答案:

答案 0 :(得分:1)

您可以抓住该表,然后抓取<tr>

的第一个实例
from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Firefox()
driver.get(URL)
html = driver.page_source # this is how you get the HTML

soup = BeautifulSoup(html)
table = soup.find('table', class_='rdo-table-tooltip')
tooltip = table.find('tr')
text = tooltip.text
由于HTML的格式化,

text会有很多额外的空格,但你可以将其删除 - 只需拆分所有空格,然后重新加入像这样的元素

final_text = ' '.join(text.split())
print final_text
# ● Client Book Revenue $20,966,618

对于多个<tr>,您可以使用.find_all('tr'),然后使用列表推导来获取行内容的列表。它看起来像这样

soup = BeautifulSoup(html)
table = soup.find('table', class_='rdo-table-tooltip')
tooltips = table.find_all('tr')
text = [' '.join(tooltip.text.split()) for tooltip in tooltips]

然后,文本将是包含每个<tr>

的文本的字符串列表

答案 1 :(得分:0)

作为替代方法,您可以使用re.findall返回标记之间的所有文本实例。这将涉及到之后的一些清理,但我发现在使用Selenium时一般非常方便。

import re

tooltips = re.findall('<tr>(.*?)<tr>', html.replace('\n', ''))

for tooltip in tooltips:
    print tooltip