通过regex或至少不使用外部库从Java中的html内容获取tweet



如何通过regex或不使用任何外部库从html内容中获取最新的tweet。我很乐意使用我不喜欢的外部库。我只是想知道这是怎么可能的。我已经用Java编写了html下载部分,如果有人愿意,我会把它发布在这里。所以我将做一个伪代码坑,这样我就不仅仅针对Java开发人员了。这就是我的程序到目前为止的样子。

1.)Load site("www.twitter.com/user123")
2.)Get initial string and write it to variable->buffer
3.)Loop start
4.)    Append string->buffer
5.)    If there is no more ->break
6.)print buffer

显然,变量缓冲区现在将具有原始html内容。我该如何处理才能获得推特。我找到了一种方法,但这太不一致了。我处理它的方法是找到包含推文的字符串,并获得代码包围的内容。然而,这一部分有太多的变化。我的意思是它里面的一些内容发生了变化,比如字体大小。我可以写多个if语句,但有更整洁的解决方案吗?

让我首先说jsoup是一个令人惊叹的轻量级HTML解析库。你可以使用CSS选择器之类的东西。如果你决定使用图书馆,jsoup会让你的生活变得更轻松。

您可以查询TweetTextSize类的元素,然后获取文本内容。这将为您提供所有文本、标签和链接。(缺点是链接中也提供了图片)

否则,您将需要手动遍历DOM。例如,使用regex查找第一个TweetTextSize的开头,然后只保留不在<>之间的所有文本。

不幸的是,第二个解决方案是不稳定的,将来可能无法工作,并且您最终会得到一大堆过于复杂且难以调试的代码。

如果您想要regex而不是复杂的第三方库,请简单回答。

<p[^>]+js-tweet-text[^>]*>(.*)</p>

在的"查看源"上尝试以上操作https://twitter.com/a

谢谢。

编辑:源代码:

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TweetSucker {
    public static void main(String[] args) throws Exception {
        URLConnection urlConnection = new URL("https://twitter.com/a").openConnection();
        InputStream inputStream = urlConnection.getInputStream();
        String encoding = urlConnection.getContentEncoding();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[8192];
        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            byteArrayOutputStream.write(buffer, 0, len);
        }
        String htmlContent = null;
        if (encoding != null) {
            htmlContent = new String(byteArrayOutputStream.toByteArray(), encoding);
        } else {
            htmlContent = new String(byteArrayOutputStream.toByteArray());
        }
        Pattern TWEET_PATTERN = Pattern.compile("(<p[^>]+js-tweet-text[^>]*>(.*)</p>)", Pattern.CASE_INSENSITIVE);
        Matcher matcher = TWEET_PATTERN.matcher(htmlContent);
        while (matcher.find()) {
            System.out.println("Tweet Found: " + matcher.group(2));
        }
    }
}

我知道你不想要任何库,但如果你想要真正快速的东西,这就是C#中的工作代码:

    using (IE browser = new IE())
    {
        browser.GoTo("https://twitter.com/user");
        List tweets = browser.List(Find.ById("stream-items-id"));
        if (tweets != null)
        {
            foreach (var tweet in tweets.ListItems)
            {
                var tweetText = tweet.Paras.FirstOrDefault();
                if (tweetText != null)
                {
                    MessageBox.Show(tweetText.Text);
                }
            }
        }
    }

该程序使用一个名为WatiN的库(如果您使用Visual Studio,请转到"工具"菜单,选择"NuGet Package Manager",然后选择"Manage NuGet Packages for Solution",再选择"Browse",然后在搜索框中键入"WatiN",找到库后点击"Install",安装后只需在代码中添加一个引用,然后添加一个using语句:

using WatiN.Core;

你只需将我上面写的代码复制并粘贴到按钮处理程序中就可以了,你需要更改twitter.comXXXXXX用户名来列出他们的所有推文。相应地修改代码以满足您的需要。

最新更新