如何通过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用户名来列出他们的所有推文。相应地修改代码以满足您的需要。