Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过正则表达式或至少不使用外部库从Java中的html内容获取推文_Java_Html_Regex_Twitter - Fatal编程技术网

通过正则表达式或至少不使用外部库从Java中的html内容获取推文

通过正则表达式或至少不使用外部库从Java中的html内容获取推文,java,html,regex,twitter,Java,Html,Regex,Twitter,如何通过正则表达式或不使用任何外部库从html内容获取最新推文。我很乐意使用外部库,但我不想使用。我只是想知道这怎么可能。我已经用Java编写了html下载部分,如果有人需要,我将在这里发布。 因此,我将做一个伪代码坑,这样我就不仅仅针对Java开发人员了,到目前为止,我的程序就是这样的 1.)Load site("www.twitter.com/user123") 2.)Get initial string and write it to variable->buffer 3.)Loop

如何通过正则表达式或不使用任何外部库从html内容获取最新推文。我很乐意使用外部库,但我不想使用。我只是想知道这怎么可能。我已经用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内容。我怎样才能把这件事整理出来以获得推特。我找到了一个方法,但这太不一致了。我管理它的方法是找到保存tweet的字符串,并用代码包围内容。然而,这一部分有太多的变化。我的意思是它里面的一些内容会改变,比如字体大小。我可以编写多个if语句,但有更简洁的解决方案吗?

首先让我说这是一个惊人的轻量级HTML解析库。你可以使用CSS选择器之类的东西。如果您决定使用一个库,jsoup将使您的生活更加轻松

您只需查询类为
TweetTextSize
的元素,然后获取文本内容。这将为您提供所有文本、哈希标记和链接。(缺点是链接中还提供了图片)

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


不幸的是,第二种解决方案是不稳定的,将来可能无法工作,最终您将得到大量代码,这些代码过于复杂,难以调试。

我知道您不需要任何库,但如果您想要快速的解决方案,这就是C语言中的工作代码:

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

using WatiN.Core;

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

如果您想要正则表达式而不是复杂的第三方库,请简单回答

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

在的“查看源”上尝试上述操作

谢谢

编辑: 源代码:

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));
        }
    }
}
import java.io.ByteArrayOutputStream;
导入java.io.InputStream;
导入java.net.URL;
导入java.net.URLConnection;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共类推特吸盘{
公共静态void main(字符串[]args)引发异常{
URLConnection URLConnection=新URL(“https://twitter.com/a”).openConnection();
InputStream InputStream=urlConnection.getInputStream();
字符串编码=urlConnection.getContentEncoding();
ByteArrayOutputStream ByteArrayOutputStream=新建ByteArrayOutputStream();
字节[]缓冲区=新字节[8192];
int len=0;
而((len=inputStream.read(buffer))!=-1){
写入(缓冲区,0,len);
}
字符串htmlContent=null;
if(编码!=null){
htmlContent=新字符串(byteArrayOutputStream.toByteArray(),编码);
}否则{
htmlContent=新字符串(byteArrayOutputStream.toByteArray());
}
Pattern TWEET\u Pattern=Pattern.compile((]+js TWEET text[^>]*>(.*),Pattern.CASE不区分大小写);
Matcher Matcher=TWEET_PATTERN.Matcher(htmlContent);
while(matcher.find()){
System.out.println(“Tweet发现:+matcher.group(2));
}
}
}

在您的案例中,原始html是什么样子的?您希望提取哪一部分?最新的推文。我希望它对任何用户都有效。假设该用户只是我找到的一个随机公共配置文件。如果您使用regex,它是脆弱的。我建议您使用Ruby和Nokogiri gem。解析html、CSS和XML非常容易。它有效,但原因是:我没有接受这一点是因为jsoup似乎是一个更好的解决方案。但是你实现了我在问题中提出的要求,所以我给了你奖金。谢谢:)我同意jsoup是一个更好、优雅的解决方案。
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));
        }
    }
}