【问题标题】:get all data between <div align="center"></div> with java使用 java 获取 <div align="center"></div> 之间的所有数据
【发布时间】:2012-05-18 03:19:45
【问题描述】:

我根本没有任何java经验,所以我有点迷茫。使用 selenium,我已经下载了页面的 html,并将其存储在字符串中。现在我想抓取所有数据并将其放入数组中。所以在 jquery 风格中,我会说它是这样的:

$('div[align="center"]').each(function(){
 array[] = $(this).text();
});

不同之处在于现在我必须从字符串中取出它并在 java 中执行它。因为我没有使用 java 的经验,所以我正在寻找最简单的方法。

感谢您的帮助!

【问题讨论】:

  • 您可以使用正则表达式查找
    然后调用 Zalgo :P
  • 更严重的是,selenium 不能以更结构化的方式将 html 返回给您吗?就像一棵 dom 树。

标签: java html selenium webdriver


【解决方案1】:

您可以使用 Selenium 选择正确的元素,而不是通过 Selenium 获取整个 HTML(有更轻量级的工具,请参阅 Get html file Java)。

如果您使用的是 Selenium RC:

// assuming 'selenium' is a healthy Selenium instance
String divText = selenium.getText("css=div[align='center']");

或者如果您使用的是 Selenium 2 (WebDriver):

// assuming 'driver' is a healthy WebDriver instance
String divText = driver.findElement(By.cssSelector("div[align='center']")).getText();

如果实际上有更多的&lt;div align="center"&gt;元素,你可以全部获取:

List<WebElement> divList = driver.findElements(By.cssSelector("div[align='center']"));
// and use every single one
for (WebElement elem : divList) {
    System.out.print(elem.getText());
}

The Selenium JavaDocs。特别想看WebDriverWebElement

And the Selenium documentation in examples.阅读。

【讨论】:

  • 这几乎可以正常工作,除了我需要使用 findElements 而不是 findElement。我使用 selenium 是因为我首先需要发布一些表格。
  • 是的,那是另一种选择。这样,您可以获得多个元素。我会将其编辑为答案。我很高兴它有帮助!
  • 非常感谢您的帮助!现在可以了!只有一件事,在你的最后一个例子中,[WebElements] 必须是 。再次感谢!
  • 哈,错字:)。如果您有更多问题,请随时创建一个 SO 聊天室并在此处发布指向它的链接。
【解决方案2】:

使用 selenium,而不是下载源页面,而是使用 selenium 来获取要从中获取文本的 html 元素,方法是使用 xpath 或一些定位器 (Selenium Locating strategies)..然后执行getText..something like..selenium.getText(locator_of_element)。如果它是一个元素列表,那么您可以在定位器前面使用索引进行循环,例如。 //div[0], //div[i] 等

希望对你有帮助..

【讨论】:

    【解决方案3】:

    我建议你阅读这个问题:

    Using Java to find substring of a bigger string using Regular Expression

    这里唯一的困难是您必须构建正则表达式,但这不是 java 问题。

    请阅读有关换行符的 cmets 和 Pattern.DOTALL 标志的使用。

    编辑:正如 Luciano 所说,我会寻找一种更好的方式来阅读 html。您的String 可能包含多个&lt;div align="center"&gt;,并且您可能不会一开始就得到您想要的。

    编辑:

    此代码似乎有效:

    String html = "<div align=\"center\">text</div>";
    
    Pattern MY_PATTERN = Pattern.compile("<div align=\"center\">(.*?)</div>");
    
    Matcher m = MY_PATTERN.matcher(html);
    while (m.find()) {
        String s = m.group(1);
        System.out.println(s);
    }
    

    【讨论】:

    • 我已经用正则表达式尝试过了,但我无法让它工作。生病尝试卢西亚诺的建议。感谢您的意见
    • 当我补充说下载 html 有问题,所以它还没有工作
    • 我猜是网站的服务器问题,吃完饭再试试,结果会告诉你的
    • 当我使用它时它不起作用。您的示例确实如此,但是当我更改 String html = "
      text
      ";到字符串 html = webdata.getPageSource();它没有显示任何东西。字符串 html 不是空的,当我打印他时,它会显示页面的整个源代码。
    • 你试过Pattern.DOTALL标志吗? Pattern MY_PATTERN = Pattern.compile("&lt;div align=\"center\"&gt;(.*?)&lt;/div&gt;",Pattern.DOTALL);
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签