【问题标题】:Parsing a string for a start and end in Java在Java中解析字符串的开始和结束
【发布时间】:2012-12-12 00:54:15
【问题描述】:

我根本找不到任何关于我需要为 Java 字符串执行的解析类型的文档。

所以,这不是用行或逗号之类的简单解析,而是要复杂一些。

我的程序抓取了一个网页的源代码,我需要解析它以获得视图标签的内容。

类似于解析它之间的内容

<input name="sid" type="hidden" value="

" />

所以,如果网页有这个字符串:

<input name="sid" type="hidden" value="stringvaluehere" />

它会输出

stringvaluehere

有人可以帮忙吗?我根本没有找到任何关于此类的文档,并且在其他来源处四处询问也无济于事。

谢谢!

【问题讨论】:

  • 为什么?抓取网页几乎总是比它的价值更麻烦。
  • 您可以尝试使用 java xml 解析器。看看javax.xml.parsers.SAXParser中的saxparser

标签: java string parsing webpage


【解决方案1】:

您可以为此使用库,例如​​ JSoup。这通常比尝试手动解析 DOM 容易得多。

Document doc = Jsoup.connect("http://www.example.com").get();
Elements inputs = doc.select("input#sid");
for(Element input : inputs) {
    System.out.println(input.attr("value"));
}

简单易用,重要的是易于阅读。

【讨论】:

  • 哦,哇,这看起来非常简单。非常感谢您的帮助,从现在开始,我很可能会使用该库来处理此类事情!
  • 哦,还有一个问题:获取输入值的“#sid”部分似乎不起作用。当我将其保留为普通输入时,它会转储页面上的所有输入值。您知道是否有任何方法可以通过名称或其他方式将其缩小到一个值?我尝试了所有我能想到的方法,但我在网上也找不到。
  • 抱歉,刚刚看到您的评论!上面认为您使用的 ID 为 sid,但实际上您使用的是名称属性。如果您使用 ID,则可以使用带有井号(井号)的选择器,但如果您想使用名称,则应使用 input[name=sid]。请注意,为了获得良好的可访问性,input 元素也应该都使用 ID。 (例如&lt;label for="foo"&gt;Test&lt;/label&gt;&lt;input id="foo" name="bar"/&gt;bar 将是传递的命名参数,但foo ID 会将其与其标签相关联)。有关更多 CSS 选择器,请参阅 jsoup.org/apidocs/org/jsoup/select/Selector.html
【解决方案2】:

如果你想解析 HTML,我建议使用 HTML 解析器而不是使用字符串操作。将文档解析为字符串只是在遇到意外的奇怪输入时提出问题。

这个问题讨论了一些潜在的 Java HTML 解析器:Java HTML Parsing

【讨论】:

  • 谢谢!我很可能会使用 JSoup 库,但这个链接仍然非常有用。
【解决方案3】:

如果页面是格式良好的 XML,您可以为此目的使用 XPATH 查询语言。它比低级别正则表达式匹配更清洁。或者一些现有的用于解析 HTML 的库。

【讨论】:

    【解决方案4】:

    这有点笨拙,可能有一个非常酷且古怪的正则表达式可以做得更好,但是...

    String value = "<input name=\"sid\" type=\"hidden\" value=\"stringvaluehere\" />";
    value = value.substring(value.indexOf("value=\"") + "value=\"".length());
    value = value.substring(0, value.indexOf("\""));
    System.out.println(value);
    

    打印stringvaluehere

    更新

    另一种方法是将 HTML 文本视为 XML,并使用 XML 解析器查找元素的属性。虽然听起来很复杂,但它是一个更简单的解决方案,尤其是当您倾向于解析多个网页时。

    jsoupCobra 可能有两个解决方案

    【讨论】:

    • 感谢那个代码片段,是的,我一直在想会有一些奇怪的正则表达式哈哈。不过现在已经全部完成了,感谢 JSoup 的推荐!
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2018-11-14
    • 2023-03-28
    • 2013-02-26
    • 1970-01-01
    • 2015-06-13
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多