gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:38:57 25 4
gpt4 key购买 nike

我正在尝试使用 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' 会同时给出文本和“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 的所有 block 都显示在数组中,而不仅仅是第一个 block ,请使第一条指令位于 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"
}
]
}

关于html - 如何使用 Web::Scraper 解析此 HTML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32580960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com