第一次发帖!
我遇到的问题是我正在使用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。与其尝试在事后修复它,不如首先弄清楚如何以正确的编码读取数据。