【问题标题】:Basic information extraction from html?从html中提取基本信息?
【发布时间】:2011-04-24 05:48:33
【问题描述】:

我有一个项目,用户提交许多指向外部网站的链接,我需要解析这些提交链接的 HTML 并从页面中提取基本信息,就像 Digg 和 Facebook 在提交链接时所做的那样。

我要找回:

  1. 主标题或标题(可以在标题中,h1h2p 等...)
  2. 介绍或描述文本(可以是divp 等...)
  3. 主图

我的主要问题是,这里似乎有太多可供探索的选择,而且我有点困惑,至少坐下来。到目前为止,我看到的许多解决方案似乎都不够充分或过度矫枉过正。

【问题讨论】:

  • tl;dr: 使用带有 xpath 的 html 解析库。

标签: html parsing extraction information-extraction


【解决方案1】:

您会选择一种服务器端语言来执行此操作。

例如,对于 PHP,您可以使用 get_meta_tags() 作为元标记...

$meta = get_meta_tags('http://google.com');

你可以使用 DOMDocument 来获取 title 元素(有些人可能会争论如果需要 title 元素,你也可以使用 DOMDocument 来获取元标记)。

$dom = new DOMDocument;

$dom->loadHTML('http://google.com');

$title = $dom
           ->getElementsByTagName('head')
           ->item(0)
           ->getElementsByTagName('title')
           ->item(0)
           ->nodeValue;

至于获取主图像,这需要对可能被视为主图像的内容进行某种提取。您可以获取所有 img 元素并查找页面上最大的元素。

$dom = new DOMDocument;

$dom->loadHTML('http://google.com');

$imgs = $dom
         ->getElementsByTagName('body')
         ->item(0)
         ->getElementsByTagName('img');

$imageSizes = array();

foreach($imgs as $img) {

  if ( ! $img->hasAttribute('src')) {
     continue;
  }

  $src = $img->getAttribute('src');

  // May need to prepend relative path
  // Assuming Apache, http and port 80

  $relativePath = rtrim($_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'], '/') . '/';

  if (substr($src, 0, strlen($relativePath) !== $relativePath) {
     $src = $relativePath . $src;
  }

  $imageInfo = getimageinfo($src);

  if ( ! $imageInfo) {
     continue;
  }    

  list($width, $height) = $imageInfo;

  $imageSizes[$width * $height] = $img;

}

$mainImage = end($imageSizes);

【讨论】:

  • 感谢亚历克斯的回复。不幸的是,很多时候网页在元标记中没有我需要的信息。通常网站在所有子页面上都有相同的描述标签,而不是特定于一个页面。
  • 使用图像大小的想法是个好主意。我也在想,如果你有几张大小相同或相似的图片,那么第一张图片很有可能是主图片
  • @sam 是的,很难选择主图像是什么。
猜你喜欢
  • 2012-07-04
  • 2017-04-24
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2015-02-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多