2

必要なコンテンツのセクションを識別する方法として CSS 要素を使用して HTML コンテンツをスクレイピングすることに問題はありませんが、Web ページのセクションのコンテンツをスクレイピングする必要があります。

<!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 );

したがって、テーブルの 1 つの列で、最初の部分が必要です。

51.612308

2 番目の列では、2 番目の部分が必要です。

-1.239453

これは、CSS セレクターがなくても可能ですか?

編集

これまでご協力いただき、誠にありがとうございました。

最初の問題は、サイトにログインするとすぐにリダイレクトが発生することでした。

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
4

2 に答える 2

3

これが 1 つの解決策です。to_f返される部分は文字列であるため、計算を実行するためにそれらを呼び出す必要がある場合があることに注意してください。

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 式に慣れていない場合は、代わりに次のようにすることもできます。

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

つまり、head 内のすべてのスクリプト タグを検索し、次に標準の Ruby メソッドを使用して、特定の条件に一致する最初の要素を検索します。

編集:Mechanizeを使用している場合、Nokogiriを内部的に使用してドキュメントを解析および処理します。コードを介して Nokogiri HTML Document オブジェクトを直接取得できます。

html_doc = my_mechanize_page.root

…または、このメソッドを使用して、ページのコンテンツでMechanize::Page#atNokogiri 自身を内部的に呼び出すことができます。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*\)/)
于 2012-04-05T16:05:35.543 に答える
0

はい、これは CSS セレクターなしで可能です。ページをバッファまたは配列に読み込むことができれば、必要な部分を切り分けることができます。

とで区切る()、一意の文字列を確認できますnew GLatLng。あなたが知っているのは、緯度/経度の前の要素になります。文字列を分割する方法については、NitinJS のコメントとこのページも参照してください http://www.tizag.com/javascriptT/javascript-string-split.php

于 2012-04-05T13:12:58.380 に答える