通过Mojo::DOM直接获取文本内容(all_text方法),会自动把<br>的效果给吃掉,没有换行,也就不能像浏览器那样呈现。
当然 这些符号是正常转换为 \xA0 了的。
目前的解决方法点绕,用Mojo::DOM提取关键节点的HTML,合并,交给 HTML::Parse 和 HTML::FormatText 去转文本,显示结果和浏览器大体一致。
因为经过 Mojo::DOM 处理, 已经换为空白符,在交给 HTML::FormatText 时会自动剔除行首的空白符,文段中的xA0也会自动变成半角的空白符。
=info
523066680/vicyang
2018-12
=cut
use Encode;
use File::Slurp;
use File::Basename;
use Mojo::UserAgent;
use HTML::Parse;
use HTML::FormatText;
STDOUT->autoflush(1);
our $ua = Mojo::UserAgent->new();
my $link = "http://www.zgshige.com/c/2018-12-13/7714634.shtml";
#$link = "http://www.zgshige.com/c/2015-06-10/504779.shtml";
$link =~/\/([^\/]+)\.\w+$/;
my $pgname = $1;
my $res = $ua->get( $link )->result;
abstract( $res->dom, $pgname );
sub abstract
{
my ( $dom, $pgname ) = @_;
my $title = $dom->at("h3")->content;
my $info = $dom->at(".col-md-8 .p-t-sm")->content;
my $body = $dom->at(".m-lg")->content;
# 注释
if ( $dom->at(".col-md-8 .noteBox") ) {
$note = $dom->at(".col-md-8 .noteBox")->all_text;
} else {
my $note = "";
}
my $buff = join("<br><br>", $title, $info, $body, $note);
my $formatter = HTML::FormatText->new(leftmargin =>0);
my $text = $formatter->format( parse_html($buff) );
write_file( "${pgname}.txt" , encode('utf8', $text) );
}
结果看二三楼