通过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) ); }