gpt4 book ai didi

java - 如何使用 HTML Parser 获取 HTML 页面中所有标签的完整信息

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:29 26 4
gpt4 key购买 nike

我正在使用 HTML Parser 开发应用程序。下面的代码无法获取页面中的整组标签。有一些标签漏掉了,它们的属性和正文也漏掉了。请帮我解释为什么会这样……或者建议我用其他方式……

 URL url = new URL("...");
PrintWriter pw=new PrintWriter(new FileWriter("HTMLElements.txt"));

URLConnection connection = url.openConnection();
InputStream is = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

HTMLEditorKit htmlKit = new HTMLEditorKit();
HTMLDocument htmlDoc = (HTMLDocument)htmlKit.createDefaultDocument();
HTMLEditorKit.Parser parser = new ParserDelegator();
HTMLEditorKit.ParserCallback callback = htmlDoc.getReader(0);
parser.parse(br, callback, true);

ElementIterator iterator = new ElementIterator(htmlDoc);
Element element;
while ((element = iterator.next()) != null)
{
AttributeSet attributes = element.getAttributes();
Enumeration e=attributes.getAttributeNames();

pw.println("Element Name :"+element.getName());
while(e.hasMoreElements())
{
Object key=e.nextElement();
Object val=attributes.getAttribute(key);
int startOffset = element.getStartOffset();
int endOffset = element.getEndOffset();
int length = endOffset - startOffset;
String text=htmlDoc.getText(startOffset, length);

pw.println("Key :"+key.toString()+" Value :"+val.toString()+"\r\n"+"Text :"+text+"\r\n");

}
}

最佳答案

我用 HTML Parser 相当可靠地做到了这一点,(前提是 HTML 文档不改变其结构)。具有稳定 API 的 Web 服务要好得多,但有时我们就是没有。

总体思路:

你首先要知道你要的信息在什么标签(div, meta, span等)里,并且知道标识这些标签的属性。示例:

 <span class="price"> $7.95</span>

如果您正在寻找这个“价格”,那么您对带有class“价格”的span 标签感兴趣。

HTML 解析器具有按属性过滤的功能。

filter = new HasAttributeFilter("class", "price");

当您使用过滤器进行解析时,您将获得一个节点列表,您可以对它们执行instanceof操作以确定它们是否属于您的类型有兴趣,对于 span 你会做类似的事情

if (node instanceof Span) // or any other supported element.

查看支持的标签列表 here .

一个使用 HTML 解析器获取包含网站描述的元标记的示例:

标签示例:

<meta name="description" content="Amazon.com: frankenstein: Books"/> 

代码:

import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.tags.MetaTag;

public class HTMLParserTest {
public static void main(String... args) {
Parser parser = new Parser();
//<meta name="description" content="Some texte about the site." />
HasAttributeFilter filter = new HasAttributeFilter("name", "description");
try {
parser.setResource("http://www.youtube.com");
NodeList list = parser.parse(filter);
Node node = list.elementAt(0);

if (node instanceof MetaTag) {
MetaTag meta = (MetaTag) node;
String description = meta.getAttribute("content");

System.out.println(description);
// Prints: "YouTube is a place to discover, watch, upload and share videos."
}

} catch (ParserException e) {
e.printStackTrace();
}
}

}

关于java - 如何使用 HTML Parser 获取 HTML 页面中所有标签的完整信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2287872/

26 4 0