如何用 Web::Scraper 解析这个 HTML?
How to Parse this HTML with Web::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 '
}
]
我有以下代码,但运气不太好。 'TEXT' 在处理 'p' 时给出文本和 "strong" 之间的内容,例如
'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);
谢谢。
您的代码中有两点需要更改。
要仅获取 DESCRIPTION 文本,请使用 xpath。 //p/text()
将直接在任何 p
下为您提供文本节点,因此不包括 strong
内的文本节点。
要使 p
的所有块都显示在数组中,而不仅仅是第一个,请使第一个指令在 div p
上。这样它就抓住了 div
内的所有 p
而不仅仅是 div
.
my $test = scraper {
process 'div p', 'test[]' => scraper {
process 'p strong', 'name' => 'TEXT';
process '//p/text()', 'desc' => ['TEXT', sub { s/^\s+|\s+$//g } ];
};
};
输出(Data::Printer):
\ {
test [
[0] {
desc "DESCRIPTION1",
name "TITLE1"
},
[1] {
desc "DESCRIPTION2",
name "TITLE2"
},
[2] {
desc "DESCRIPTION3",
name "TITLE3"
}
]
}
我正在尝试使用 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 '
}
]
我有以下代码,但运气不太好。 'TEXT' 在处理 'p' 时给出文本和 "strong" 之间的内容,例如
'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);
谢谢。
您的代码中有两点需要更改。
要仅获取 DESCRIPTION 文本,请使用 xpath。 //p/text()
将直接在任何 p
下为您提供文本节点,因此不包括 strong
内的文本节点。
要使 p
的所有块都显示在数组中,而不仅仅是第一个,请使第一个指令在 div p
上。这样它就抓住了 div
内的所有 p
而不仅仅是 div
.
my $test = scraper {
process 'div p', 'test[]' => scraper {
process 'p strong', 'name' => 'TEXT';
process '//p/text()', 'desc' => ['TEXT', sub { s/^\s+|\s+$//g } ];
};
};
输出(Data::Printer):
\ {
test [
[0] {
desc "DESCRIPTION1",
name "TITLE1"
},
[1] {
desc "DESCRIPTION2",
name "TITLE2"
},
[2] {
desc "DESCRIPTION3",
name "TITLE3"
}
]
}