首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >屏幕刮擦HTML头内容?

屏幕刮擦HTML头内容?
EN

Stack Overflow用户
提问于 2012-04-05 13:04:38
回答 2查看 843关注 0票数 2

我很乐意使用CSS元素来抓取HTML内容,将其作为识别我想要的内容的一种方法,但我需要抓取网页部分的内容:

代码语言:javascript
代码运行次数:0
运行
复制
<!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/.";

我需要从这一行解析纬度和经度:

代码语言:javascript
代码运行次数:0
运行
复制
map.setCenter( new GLatLng( 51.612308, -1.239453 ), 11 );

所以,在我桌子的一栏里,我想要第一部分:

代码语言:javascript
代码运行次数:0
运行
复制
51.612308

在第二栏中,我希望第二部分:

代码语言:javascript
代码运行次数:0
运行
复制
-1.239453

如果没有CSS选择器,这是可能的吗?

编辑

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

最初的问题是,一旦您登录到该站点,我就会重新定向,现在我会这样做:

代码语言:javascript
代码运行次数:0
运行
复制
put page.root

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

代码语言:javascript
代码运行次数:0
运行
复制
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"

在运行上述命令时,我会得到一个错误:

代码语言:javascript
代码运行次数:0
运行
复制
undefined local variable or method `script' for main:Object
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-05 16:05:35

这里有一个解决方案;请注意返回的部分是字符串,因此您可能需要调用它们的to_f来执行计算:

代码语言:javascript
代码运行次数:0
运行
复制
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"

如果您不习惯使用这个XPath表达式来查找脚本,您也可以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
script = html.css('head script').find{ |el| el['src'].nil? }

即在头中查找所有脚本标记,然后使用标准红宝石法查找与特定条件匹配的第一个元素。

编辑:如果您正在使用机械化,它在内部使用Nokogiri来解析和处理文档。您可以通过代码直接获得Nokogiri HTML文档对象。

代码语言:javascript
代码运行次数:0
运行
复制
html_doc = my_mechanize_page.root

…或者您可以使用Mechanize::Page#at方法在页面内容的内部调用Nokogiri自己的at

我个人更喜欢前者,因为Nokogiri文档为您提供了一组比at__更丰富的方法。但是,这两种方法都适用于上述代码。

编辑2:例如:

代码语言:javascript
代码运行次数:0
运行
复制
script = page.at('/html/head/script[not(@src)]')
parts = script.text.match(/new GLatLng\(\s*(?<lat>.+?)\s*,\s*(?<long>.+?)\s*\)/)
票数 3
EN

Stack Overflow用户

发布于 2012-04-05 13:12:58

是的,没有CSS选择器,这是可能的。如果您可以将页面读入缓冲区或数组中,则可以将所需的部分分离开来。

()上进行分隔将允许您检查惟一的字符串new GLatLng。你知道,这将是你的长/长之前的元素。还请参阅NitinJS的评论和此页面以帮助拆分字符串http://www.tizag.com/javascriptT/javascript-string-split.php

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10029166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档