在Qt中解析HTML的最佳方法是什么?

17

我该如何在Qt中解析一个充满错误的HTML页面上的所有"a"标签的"href"属性?


1
你能说得更具体一些,HTML有什么问题吗?是经常出现问题,还是完全垃圾?你无法修复正在生成HTML的东西吗? - Bill
2
请勿使用正则表达式... https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - Malfist
1
这是一个谷歌搜索,谷歌的HTML很糟糕。在检查这个文档作为HTML5时发现以下错误! 结果:50个错误,16个警告。 - y2k
@JOSHUA:这些错误会阻止Qt使用QtWebKit解析HTML吗? - Bill
1
我不知道如何使用QtWebKit来做这件事,而且唯一显示的答案表明它不起作用... 我想页面需要加载或者什么东西? - y2k
2个回答

19

我会使用内置的QtWebKit。不知道它在性能方面如何,但我认为它应该能捕捉到所有“不好”的HTML。 类似这样:

class MyPageLoader : public QObject
{
  Q_OBJECT

public:
  MyPageLoader();
  void loadPage(const QUrl&);

public slots:
  void replyFinished(bool);

private:
  QWebView* m_view;
};

MyPageLoader::MyPageLoader()
{
  m_view = new QWebView();

  connect(m_view, SIGNAL(loadFinished(bool)),
          this, SLOT(replyFinished(bool)));
}

void MyPageLoader::loadPage(const QUrl& url)
{
  m_view->load(url);
}

void MyPageLoader::replyFinished(bool ok)
{
  QWebElementCollection elements = m_view->page()->mainFrame()->findAllElements("a");

  foreach (QWebElement e, elements) {
    // Process element e
  }
}

使用这个类:

MyPageLoader loader;
loader.loadPage("http://www.example.com")

然后对集合进行任何你想做的操作。


1
我清理了一下,但还是不行...我需要等待页面加载或者其他什么吗? - y2k
1
@JOSHUA:我建议你等到收到loadFinished(bool)信号再进行操作。 (http://doc.trolltech.com/4.6/qwebview.html#loadFinished) - Bill

7
这个问题已经相当老了。尽管如此,我希望这会对某些人有所帮助:
我编写了两个小类用于Qt,并在sourceforge上发布了它们。这将帮助您访问一个与XML相似的html文件。
在这里您将找到该项目:http://sourceforge.net/projects/sgml-for-qt/。在这里,您将在wiki中找到一个帮助系统。
Drewle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接