如何使用Web :: Scraper解析此HTML?

时间:2015-09-15 08:12:48

标签: html perl dom web-scraping scraper

我正在尝试使用Web::Scraper来解析以下HTML:

<div>
<p><strong>TITLE1</strong>
<br>
DESCRIPTION1
</p>
<p><strong>TITLE2</strong>
<br>
DESCRIPTION2
</p>
<p><strong>TITLE3</strong>
<br>
DESCRIPTION3
</p>
</div>

进入

      'test' => [
                  {
                    'name' => 'TITLE1',
                    'desc' => 'DESCRIPTION1 '
                  },
                  {
                    'name' => 'TITLE2',
                    'desc' => 'DESCRIPTION2 '
                  },
                  {
                    'name' => 'TITLE3',
                    'desc' => 'DESCRIPTION3 '
                  }
                ]

我有以下代码,但我没有太多运气。处理'p'时'TEXT'同时给出文本和“强”之间的内容,例如

      'test' => [
                  {
                    'name' => 'TITLE1',
                    'desc' => 'TITLE1 DESCRIPTION1 '
                  }
                ]

加上它唯一的第一项。

这是我的代码。

use strict;
use Web::Scraper;
use Data::Dumper;

my $html = q[<div>
            <p><strong>TITLE1</strong>
            <br>
            DESCRIPTION1
            </p>
            <p><strong>TITLE2</strong>
            <br>
            DESCRIPTION2
            </p>
            <p><strong>TITLE3</strong>
            <br>
            DESCRIPTION3
            </p>
           </div>
           ];

 my $test = scraper {
 process 'div', 'test[]' => scraper {
    process 'p strong', 'name' => 'TEXT';
    process 'p','desc' => 'TEXT';       
   };
 };

  my $res = $test->scrape(\$html);
  print Dumper($res);   

谢谢。

1 个答案:

答案 0 :(得分:2)

您的代码中有两点需要更改。

要仅获取 DESCRIPTION -text,请使用xpath。 //p/text()会直接在任意p下为您提供文字节点,因此不包含strong内的文字节点。

要使p的所有块都显示在数组中,而不仅仅是第一个,请将第一条指令放在div p上。这样就可以抓取p内的所有div而不只是div内的my $test = scraper { process 'div p', 'test[]' => scraper { process 'p strong', 'name' => 'TEXT'; process '//p/text()', 'desc' => ['TEXT', sub { s/^\s+|\s+$//g } ]; }; };

\ {
    test   [
        [0] {
            desc   "DESCRIPTION1",
            name   "TITLE1"
        },
        [1] {
            desc   "DESCRIPTION2",
            name   "TITLE2"
        },
        [2] {
            desc   "DESCRIPTION3",
            name   "TITLE3"
        }
    ]
}

输出(Data::Printer):

Error:duplicate files during packaging of APK D:\andriod App\JsonArray\app\build\outputs\apk\app-debug-unaligned.apk