2012-04-05 69 views
2

我很舒服通过使用CSS元素作为识别我想要的内容部分的方法刮HTML内容,但我需要刮网页的部分内容:屏幕抓取HTML头内容?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<!-- saved from url=(0028)http://www.peoplesafe.co.uk/ --> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title>PeopleSafe</title> 
    <link href="css/screen.css" media="screen" rel="stylesheet" type="text/css" /> 
    <!--[if lte IE 6]> 
    <link href="http://www.peoplesafe.co.uk/styles/default/screen_ie6.css" media="screen" rel="stylesheet" type="text/css" /> 
    <![endif]--> 
    <link rel="icon" href="http://www.peoplesafe.co.uk/styles/default/favicon.ico" /> 

     <script type="text/javascript" src="js/tabpane.js"></script> 
    <link type="text/css" rel="StyleSheet" href="css/tab.webfx.css?v=2" /> 


    <meta http-equiv="Author" content="Rare Creative Group" /> 
    <meta http-equiv="Description" content="Experts in lone worker safety" /> 
    <meta http-equiv="Keywords" content="lone, worker, safety" /> 
    <script type="text/javascript" src="js/spotlight.js"></script> 
    <script type="text/javascript" src="js/promo.js"></script>  

<script src="http://maps.google.com/maps?ile=api&amp;v=2&amp;sensor=true&amp;key=ABQIAAAA04SCF3o4CZghg6c0Qqgd-RQxzn3bXKr_TQ6C8c2CiIf8-vjJhBS3endtVbbJ1vftXL4Wbb2PwuJ8ag" type="text/javascript"></script> 
<script type="text/javascript"> 
//<![CDATA[ 
function load() 
{ 
    // required for original Peoplesafe layout: 
    start(); 

    if (GBrowserIsCompatible()) 
    { 
     // codice setcenter: 
     var map = new GMap2(document.getElementById("map")); 

     var customUI = map.getDefaultUI(); 
     // Remove MapType.G_HYBRID_MAP 
     //customUI.maptypes.hybrid = false; 
     map.setUI(customUI); 
     //map.addControl(new GSmallMapControl()); 
     //map.addControl(new GMapTypeControl()); 

     map.setCenter(new GLatLng(51.612308, -1.239453), 11); 

     // Crea un nuovo marker nel punto specificato con una descrizione HTML associata: 
     function createMarker(point, description, primary_contact_id) 
     { 
      //var icon = new GIcon(); 
      ////icon.shadow = "/images/nuvola.png"; 
      //icon.iconSize = new GSize(87, 38); 
      ////icon.shadowSize = new GSize(107, 38); 
      //icon.iconAnchor = new GPoint(6, 20); 
      //icon.infoWindowAnchor = new GPoint(5, 1); 
      //icon.image = "/img/."; 

我需要某种方式解析来自该行的纬度和经度:

map.setCenter(new GLatLng(51.612308, -1.239453), 11); 

所以在我的表中的一列,我想第一部分:

51.612308 

并在第二列,我想第二部分:

-1.239453 

这是可能的,而不CSS选择器的可用性?

编辑

感谢您的帮助,到目前为止,非常appreiated!

最初的问题是,一旦你登录到网站与重定向的事,我已经排序时,现在当我做的:

put page.root 

我得到的页面的全部来源,我期望。所以,现在我的代码(登录后)为:

html_doc = page.root 

# Find the first <script> in the head that does not have src="..." 
#script = html.at_xpath('/html/head/script[not(@src)]') 

# Use a regex to find the correct code parts in the JS, using named captures 
parts = script.text.match(/new GLatLng\(\s*(?<lat>.+?)\s*,\s*(?<long>.+?)\s*\)/) 

p parts[:lat], parts[:long] 
#=> "51.612308" 
#=> "-1.239453" 

我运行上面的时候得到一个错误:

undefined local variable or method `script' for main:Object 
+0

难道你们就不能只是把它们与HTML?他们是静态的吗? – RyanS 2012-04-05 13:07:54

+0

这是一个没有API的服务提供商网站,我们有权删除,但我们无法更改HTML代码。他们是我们用于单身工人的手机的经纬度,几乎是实时的。 – dannymcc 2012-04-05 13:08:50

+0

在您的主机环境中使用一些服务器端技术编写web方法asp.net,php,jsp来取消网页数据,然后从返回的html内容中提取数据 – 2012-04-05 13:09:46

回答

3

下面是一种解决方案;需要注意的是,返回部分是字符串,所以你可能需要调用to_f他们来进行计算:如果你不舒服与XPath表达式找到脚本

require 'nokogiri' 
html_doc = Nokogiri.HTML(my_html) 

# Find the first <script> in the head that does not have src="..." 
script = html_doc.at_xpath('/html/head/script[not(@src)]') 

# Use a regex to find the correct code parts in the JS, using named captures 
parts = script.text.match(/new GLatLng\(\s*(?<lat>.+?)\s*,\s*(?<long>.+?)\s*\)/) 

p parts[:lat], parts[:long] 
#=> "51.612308" 
#=> "-1.239453" 

,你可以或者做类似:

script = html.css('head script').find{ |el| el['src'].nil? } 

即查找头的所有脚本标记,然后用standard Ruby method找到匹配的特定标准的第一要素。

编辑:如果您使用的是机械化,它会在内部使用Nokogiri来解析和处理文档。您可以通过代码

html_doc = my_mechanize_page.root 

直接将引入nokogiri HTML文档对象...或者你可以使用Mechanize::Page#at方法来调用引入nokogiri自己at内部页面的内容。

我个人比较喜欢前者,因为Nokogiri Document给你提供了一套比at更丰富的方法。但是,要么使用上面的代码。

编辑2:例如:

script = page.at('/html/head/script[not(@src)]') 
parts = script.text.match(/new GLatLng\(\s*(?<lat>.+?)\s*,\s*(?<long>.+?)\s*\)/) 
+0

使用你的第一个例子,我得到一个错误。整个脚本看起来像这个https://gist.github.com/2312571我错过了什么? – dannymcc 2012-04-05 17:12:02

+0

@dannymcc是的,你错过了一些东西。阅读错误消息说的内容。然后严格审查剧本的第24行。 – Phrogz 2012-04-05 17:14:39

+0

'html = Nokogiri.HTML(my_html)'24行混淆了我,我应该用什么替换my_html? – dannymcc 2012-04-05 17:20:14

0

是的,这是没有可能的CSS选择器。如果你可以将页面读入缓冲区或数组,你可以分开你需要的部分。

划定在()将允许您检查唯一字符串new GLatLng。你知道这将是你的纬度/经度之前的元素。另请参见NitinJS的评论和此页面以帮助将字符串分开http://www.tizag.com/javascriptT/javascript-string-split.php

+0

Ruby:http://ruby.about.com/od/advancedruby/a/split.htm – RyanS 2012-04-05 14:01:11