使用selenium在twitter上获得关注者数量

时间:2015-11-06 15:39:08

标签: java selenium-webdriver

我正试图在twitter上获得关注者的数量。我成功地设法获得了许多粉丝:

String followers = driver.findElement(By.xpath("//div[@class='ProfileCanopy-navBar']//li[@class='ProfileNav-item ProfileNav-item--followers']//span[@class='ProfileNav-value']")).getText();

问题是答案不是确切的数字,“4.41M”。

HTML:

<a class="ProfileNav-stat ProfileNav-stat--link u-borderUserColor u-textCenter js-tooltip js-nav" data-nav="followers" tabindex="0" data-original-title="4,406,048 Followers">
    <span class="ProfileNav-label">Followers</span>
    <span class="ProfileNav-value" data-is-compact="true">4.41M</span>
</a>

我正在尝试获取数字“4,406,048”(在属性a的末尾)。我在网上看了大约一个小时,但找不到合适的解决方案。我正在使用Selenium与Java和Chrome。

3 个答案:

答案 0 :(得分:2)

由于您引用了Selenium,因此您可以使用getAttribute()返回给定属性的值。在这种情况下,我们需要&#39; data-original-title&#39;。

的值
driver.findElement(By.cssSelector("[data-nav='followers']")).getAttribute("data-original-title");

然后,由于这会返回比您想要的数据更多的数据(x关注者),因此您可以使用一些Java去除非数字:

replaceAll("[$A-Za-z , ]", "");

所以放在一起它看起来像这样:

String followers = driver.findElement(By.cssSelector("[data-nav='followers']"))
        .getAttribute("data-original-title").replaceAll("[$A-Za-z , ]", "");

您使用的是getText(),它返回元素的内部文本。 GetAttribute()返回属性的值,在本例中为data-original-title。

以下是我用来确认它适用于您提供的HTML的代码。

    public static void main(String[] args)
{
    ChromeDriver driver = new ChromeDriver();
    driver.get("file:///C:/Users/myId/Downloads/stack.html");
    String followers = driver.findElement(By.cssSelector("[data-nav='followers']"))
        .getAttribute("data-original-title").replaceAll("[$A-Za-z , ]", "");
    System.out.println(followers);
}

答案 1 :(得分:1)

这是一个奇怪的。我编写了应该提取数字的代码,但它也继续返回null。我终于弄清楚当我拉出元素然后写出outerHTML时发生了什么。页面加载期间正在更改元素。

WebDriver driver = new FirefoxDriver();
driver.get("https://twitter.com/blakeshelton");
WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement e = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("a[data-nav='followers']")));
System.out.println(e.getAttribute("outerHTML"));
System.out.println(e.getAttribute("title"));

如果您运行此代码,您将获得

<a class="ProfileNav-stat ProfileNav-stat--link u-borderUserColor u-textCenter js-tooltip js-openSignupDialog js-nonNavigable u-textUserColor" title="14,189,678 Followers" data-nav="followers" href="/blakeshelton/followers">
    <span class="ProfileNav-label">Followers</span>
    <span class="ProfileNav-value" data-is-compact="true">14.2M</span>
</a>
14,189,678 Followers

您会注意到outerHTML中的A标记中title包含关注者的数量。这就是我使用它而不是data-original-title的原因。无论如何,这段代码已经过测试并且有效。

答案 2 :(得分:0)

您可以使用检查工具在chrome中测试它,然后测试您的xpath。

你应该这样做:

$x("//a[@data-nav='followers']/@data-original-title")

这让我

[data-original-title=​"1,880,556 Followers"]

从那里开始只用Java评估。