当前位置: 首页 > 知识库问答 >
问题:

使用java和jsoup从html标记中提取值

艾安和
2023-03-14

我有这个html

<html><head><title>Alfresco Content Repository</title><style>body { font-family: Arial, Helvetica; font-size: 12pt; background-color: white; }
table { font-family: Arial, Helvetica; font-size: 12pt; background-color: white; }
.listingTable { border: solid black 1px; }
.textCommand { font-family: verdana; font-size: 10pt; }
.textLocation { font-family: verdana; font-size: 11pt; font-weight: bold; color: #2a568f; }
.textData { font-family: verdana; font-size: 10pt; }
.tableHeading { font-family: verdana; font-size: 10pt; font-weight: bold; color: white; background-color: #2a568f; }
.rowOdd { background-color: #eeeeee; }
.rowEven { background-color: #dddddd; }
</style></head>
<body>
<table cellspacing='2' cellpadding='3' border='0' width='100%'>
<tr><td colspan='4' class='textLocation'>Directory listing for /rep</td></tr>
<tr><td height='10' colspan='4'></td></tr></table><table cellspacing='2' cellpadding='3' border='0' width='100%' class='listingTable'>
<tr><td class='tableHeading' width='*'>Name</td><td class='tableHeading' width='10%'>Size</td><td class='tableHeading' width='20%'>Type</td><td class='tableHeading' width='25%'>Modified Date</td></tr>
<tr class='rowOdd'><td class='textData'><a href="/alfresco/webdav/rep/ED">ED</a></td><td class='textData'>&nbsp;</td><td class='textData'>&nbsp;</td><td class='textData'>Thu, 05 Jan 2017 11:11:14 GMT</td></tr>
<tr class='rowEven'><td class='textData'><a href="/alfresco/webdav/rep/FLOW%20CHART">FLOW CHART</a></td><td class='textData'>&nbsp;</td><td class='textData'>&nbsp;</td><td class='textData'>Thu, 27 Jun 2013 13:30:18 GMT</td></tr>
<tr class='rowOdd'><td class='textData'><a href="/alfresco/webdav/rep/file">file</a></td><td class='textData'>&nbsp;</td><td class='textData'>&nbsp;</td><td class='textData'>Wed, 10 Nov 2021 13:16:49 GMT</td></tr>


</table></body></html>

并且,我试图得到每个标签的href。

例如,

  
<table cellspacing='2' cellpadding='3' border='0' width='100%'>
<tr><td colspan='4' class='textLocation'>Directory listing for /rep</td></tr>
<tr><td height='10' colspan='4'></td></tr></table><table cellspacing='2' cellpadding='3' border='0' width='100%' class='listingTable'>
<tr><td class='tableHeading' width='*'>Name</td><td class='tableHeading' width='10%'>Size</td><td class='tableHeading' width='20%'>Type</td><td class='tableHeading' width='25%'>Modified Date</td></tr>
<tr class='rowOdd'><td class='textData'><a href="/alfresco/webdav/rep/ED">ED</a></td><td class='textData'>&nbsp;</td><td class='textData'>&nbsp;</td><td class='textData'>Thu, 05 Jan 2017 11:11:14 GMT</td></tr>

共有1个答案

吕成业
2023-03-14

首先,您需要解析html,它是要文档的字符串。

final Document document = Jsoup.parse(html);

然后需要选择所有tr标记,其中包含标记。

final Elements trElements = document.select("tr:has(a)");

之后,您需要浏览找到的每个tr标记:

for (final Element trElement : trElements) {
    //Do stuff
}
final Element aElement = trElement.select("a").first();
final String href = aElement.attr("href");
final String name = aElement.text();

对于date,需要从tr标记中检索第四个td标记:

final Element dateTdElement = trElement.select("td").get(3);

只需检索值文本即可获得日期内容:

final String date = dateTdElement.text();

注意:方法select()接受css查询。所有css查询都是有效的,使用扩展的语法,如':hav()'和其他部分。有关更多细节,请参见Jsoup文档。

public static void main(final String[] args) {
    final String html = "<html><head><title>Alfresco Content Repository</title><style>body { font-family: Arial, Helvetica; font-size: 12pt; background-color: white; }\n" +
            "table { font-family: Arial, Helvetica; font-size: 12pt; background-color: white; }\n" +
            ".listingTable { border: solid black 1px; }\n" +
            ".textCommand { font-family: verdana; font-size: 10pt; }\n" +
            ".textLocation { font-family: verdana; font-size: 11pt; font-weight: bold; color: #2a568f; }\n" +
            ".textData { font-family: verdana; font-size: 10pt; }\n" +
            ".tableHeading { font-family: verdana; font-size: 10pt; font-weight: bold; color: white; background-color: #2a568f; }\n" +
            ".rowOdd { background-color: #eeeeee; }\n" +
            ".rowEven { background-color: #dddddd; }\n" +
            "</style></head>\n" +
            "<body>\n" +
            "<table cellspacing='2' cellpadding='3' border='0' width='100%'>\n" +
            "<tr><td colspan='4' class='textLocation'>Directory listing for /rep</td></tr>\n" +
            "<tr><td height='10' colspan='4'></td></tr></table><table cellspacing='2' cellpadding='3' border='0' width='100%' class='listingTable'>\n" +
            "<tr><td class='tableHeading' width='*'>Name</td><td class='tableHeading' width='10%'>Size</td><td class='tableHeading' width='20%'>Type</td><td class='tableHeading' width='25%'>Modified Date</td></tr>\n" +
            "<tr class='rowOdd'><td class='textData'><a href=\"/alfresco/webdav/rep/ED\">ED</a></td><td class='textData'>&nbsp;</td><td class='textData'>&nbsp;</td><td class='textData'>Thu, 05 Jan 2017 11:11:14 GMT</td></tr>\n" +
            "<tr class='rowEven'><td class='textData'><a href=\"/alfresco/webdav/rep/FLOW%20CHART\">FLOW CHART</a></td><td class='textData'>&nbsp;</td><td class='textData'>&nbsp;</td><td class='textData'>Thu, 27 Jun 2013 13:30:18 GMT</td></tr>\n" +
            "<tr class='rowOdd'><td class='textData'><a href=\"/alfresco/webdav/rep/file\">file</a></td><td class='textData'>&nbsp;</td><td class='textData'>&nbsp;</td><td class='textData'>Wed, 10 Nov 2021 13:16:49 GMT</td></tr>\n" +
            "\n" +
            "\n" +
            "</table></body></html>";

    final Document document = Jsoup.parse(html);
    final Elements trElements = document.select("tr:has(a)");
    for (final Element trElement : trElements) {
        final Element aElement = trElement.select("a").first();
        final String href = aElement.attr("href");
        System.out.println("Href : " + href);

        final String name = aElement.text();
        System.out.println("Name : " + name);

        final Element dateTdElement = trElement.select("td").get(3);
        final String date = dateTdElement.text();
        System.out.println("Date : " + date);
    }
}
Href : /alfresco/webdav/rep/ED
Name : ED
Date : Thu, 05 Jan 2017 11:11:14 GMT
Href : /alfresco/webdav/rep/FLOW%20CHART
Name : FLOW CHART
Date : Thu, 27 Jun 2013 13:30:18 GMT
Href : /alfresco/webdav/rep/file
Name : file
Date : Wed, 10 Nov 2021 13:16:49 GMT
 类似资料:
  • 嗨,我有一个html文件解析的场景。我正在使用jsoup解析html文件,解析后我想提取头标记(h1、h3、h4)。我用过医生。select()但它将只返回标题标记值,但我的要求是我应该提取h1到h3或h4之间的标记,反之亦然。 所以这里首先搜索html字符串是否包含任何H1,H3,H4。这里我们有h4,所以包括h4,它应该搜索下一个h1或h3,直到h3我们提取字符串并把它放在一个单独的html文

  • 我一直在研究用于数据提取的Jsoup示例,并提取了此链接的一个示例 J汤

  • “我妈妈有一双蓝眼睛,我爸爸有一双深绿色的眼睛”。我想用JSOUP解析这个句子,并在android textview上用粗体和彩色文本打印出来。这里的“蓝色”是大胆的蓝色。“深绿色”是大胆的颜色。 我需要解析上述html代码,并需要如下显示: 这是一个标题 我母亲有蓝色的眼睛,我父亲有深绿色的眼睛 这是另一个标题 这是一段 下面是我的程序。考虑到文档doc==获取上面的html; 有人能帮我解决吗

  • 如何从下面的html中解析出46389333? 我使用的是JSoup,显然我可以解析文本、标签和其他值。但是我不知道如何解析这个值。即使我只能解析出/exampleTweet/status/46389333,至少我可以解析这个字符串,这要容易得多。问题是,数字变了,显然例子也变了。不过,地位还是存在的,所以也许我可以利用这一点?任何帮助都是巨大的。

  • 问题内容: 当我使用jsoup提取数据时遇到一个职位。数据如下: 我想要这样的数据: 我怎样才能做到这一点?谁能帮我? 问题答案: 您可以将html解析为,选择-Element并获取其文本。 例: 输出:

  • 所以我尝试从pretag获取数据,我设置doc连接到url选择pretag,结果出错了,我需要获取的数据按这里