XPath和链接的问题



第一次发帖!

我遇到的问题是我正在使用XPath和Tag-Soup来解析网页并读取数据。由于这些是新闻文章,有时它们的内容中嵌入了链接,这些链接会干扰我的程序。

我使用的XPath是storyPath = "//html:article//html:p//text()";,其中页面的结构为:

<article ...>
   <p>Some text from the story.</p>
   <p>More of the story, which proves <a href="">what a great story this is</a>!</p>
   <p>More of the story without links!</p>
</article>

与xpath求值相关的代码如下:

NodeList nL = XPathAPI.selectNodeList(doc,storyPath);
LinkedList<String> story = new LinkedList<String>();
    for (int i=0; i<nL.getLength(); i++) {
        Node n = nL.item(i);
        String tmp = n.toString();
        tmp = tmp.replace("[#text:", "");
        tmp = tmp.replace("]", "");
        tmp = tmp.replaceAll("’", "'");
        tmp = tmp.replaceAll("‘", "'");
        tmp = tmp.replaceAll("–", "-");
        tmp = tmp.replaceAll("¬", "");
        tmp = tmp.trim();
        story.add(tmp);
    }
this.setStory(story);
...
private void setStory(LinkedList<String> story) {
    String tmp = "";
    for (String p : story) {
        tmp = tmp + p + "nn";
    }
    this.story = tmp.trim();
}

输出是

Some text from the story.
More of the story, which proves 
what a great story this is
!
More of the story without links!

有没有人有办法让我消除这个错误?我是不是说错了?(我知道我可以很好地使用setStory代码,但没有看到其他方法。

如果没有tmp.replace()代码,所有的结果都显示为[#text: what a great story this is]等

编辑:

我仍然有麻烦,虽然可能是另一种。最让我头疼的还是一个链接,但是BBC网站的链接是在另一行上的,因此它读起来还是和之前描述的一样(注意,这个问题已经用给出的例子修复了)。BBC页面上的代码部分是:
    <p>    Former Queens Park Rangers trainee Sterling, who 
    <a  href="http://news.bbc.co.uk/sport1/hi/football/teams/l/liverpool/8541174.stm" >moved to the Merseyside club in February 2010 aged 15,</a> 
    had not started a senior match for the Reds before this season.
    </p>

在输出中显示为:

    Former Queens Park Rangers trainee Sterling, who 
    moved to the Merseyside club in February 2010 aged 15, 
         had not started a senior match for the Reds before this season.

对于html源代码中的新行出现在文本文档中的编辑问题,您需要在打印它们之前删除它们。用System.out.println(text.trim().replaceAll("[ trn]+", " "));代替System.out.print(text.trim());

首先找到段落,:storyPath = "//html:article//html:p,然后对于每个段落,用另一个xpath查询取出所有文本,并将它们连接起来,不使用新行,并在段落末尾放置两个新行。

另一个注意事项,您不应该必须replaceAll("‚Äô", "'")。这是一个明确的信号,表明你打开文件的方式不正确。当您打开文件时,您需要将Reader传递到标签汤中。您应该像这样初始化Reader: Reader r = new BufferedReader(new InputStreamReader(new FileInputStream("myfilename.html"),"Cp1252"));在这里为文件指定正确的字符集。这里有一个字符集列表:http://docs.oracle.com/javase/1.5.0/docs/guide/intl/encoding.doc.html我猜它是Windows latin 1.

[#text:就是DOM Text节点的toString()表示。toString()方法用于需要节点的字符串表示以进行调试的情况。用getTextContent()代替toString(),它返回实际的文本。

如果您不希望链接内容出现在单独的行上,那么您可以从XPath中删除//text(),直接获取元素节点的textContent(元素的getTextContent()返回所有后代文本节点的连接)

String storyPath = "//html:article//html:p";
NodeList nL = XPathAPI.selectNodeList(doc,storyPath);
LinkedList<String> story = new LinkedList<String>();
for (int i=0; i<nL.getLength(); i++) {
    Node n = nL.item(i);
    story.add(n.getTextContent().trim());
}

事实上,你必须手动修复的东西,如"‚Äô"建议你的HTML实际上是在UTF-8编码,但你正在阅读它使用单字节字符集,如Windows1252。与其尝试在事后修复它,不如首先弄清楚如何以正确的编码读取数据。

相关内容

  • 没有找到相关文章

最新更新