我是Perl的新手,并在某些情况下尝试从HTML文件中删除表。
这里是一个例子。如果字符串不包含字符串xyz,我想删除表标记之间的字符串。但是代码不起作用,它不会删除第一个表。我应该如何修改代码才能使其正常工作?非常感谢你!
这是我的代码:
use strict;
use warnings;
use autodie;
my $data = <<TEXT;
<table>
(aaa)
</table>
<table>
xyz
</table>
TEXT
my @find=();
@find=$data =~ m/<TABLE[^>]*>(.*?)<\/TABLE>/imosg;
foreach (@find) {
if ($_!~ m/xyz/imosg){$data =~ s/$_//;}
}
print "$data\n","*" x 40, "\n" ;
答案 0 :(得分:1)
尽管您可以摆脱使用正则表达式进行HTML的快速,肮脏的处理,但您可能还是希望考虑使用HTML解析器作为一种不太容易出错的方法。这是一个示例:
#!/usr/bin/perl
use 5.012;
use strict;
use warnings;
use autodie;
use XML::LibXML;
my $html = <<'EOF';
<!DOCTYPE html>
<html>
<head>
<title>Test Document</title>
</head>
<body>
<table>
<thead>
<tr><th>Country</th><th>Population</th></tr>
</thead>
<tbody>
<tr><td>Lithuania</td><td>2,908,249</td></tr>
<tr><td>Bermuda</td><td>61,666</td></tr>
</tbody>
</table>
<table>
<thead>
<tr><th>Country</th><th>Population</th></tr>
</thead>
<tbody>
<tr><td>Botswana</td><td>2,250,260</td></tr>
<tr><td>Dominica</td><td>73,543</td></tr>
</tbody>
</table>
</body>
</html>
EOF
my $dom = XML::LibXML->load_html(
string => $html,
recover => 1,
);
foreach my $table ($dom->findnodes('//table')) {
my $text_content = $table->to_literal;
if($text_content =~ /botswana/i) {
$table->parentNode->removeChild($table);
}
}
say $dom->toStringHTML();
答案 1 :(得分:1)
use Web::Query::LibXML 'wq';
my $w = wq <<'HTML';
<html><body>
<table>
(aaa)
</table>
<table>
xyz
</table>
HTML
$w->find('table:not(:contains("xyz"))')->html('');
print $w->as_html;
答案 2 :(得分:0)
per_process_gpu_memory_fraction=0.0001
包含字符串@find
(其中\n(aaa)\n
是换行符)。调用\n
时,您不匹配,因为$data =~ s/$_//
中的括号字符是正则表达式元字符。 $_
不匹配并替换字符串$data =~ s/\n(aaa)\n//
;它与字符串\n(aaa)\n
匹配,并返回字符串\naaa\n
作为捕获组(例如,在特殊变量aaa
中)。
Perl提供了两种机制来匹配正则表达式中的文字字符串。一种是将字符串包装在$1
和\Q
标签中(有时是可选的):
\E
第二种方法是在应用正则表达式之前使用quotemeta
函数。
$data =~ s/\Q$_\E//; # match literal contents of $_
答案 3 :(得分:0)
CREATE TABLE dbo.all_tickers(
ticker_symbol varchar(32) NOT NULL,
[Date] datetime2(7) NOT NULL,
[Open] float NULL,
High float NULL,
Low float NULL,
[close] float NULL,
Volume float NULL,
PRIMARY KEY (ticker_symbol, [Date])
);
GO
DECLARE @Path nvarchar(255) = 'D:\ASX';
DECLARE @SQL nvarchar(MAX);
CREATE TABLE #ticker_staging(
[Date] datetime2(7) NOT NULL,
[Open] float NULL,
High float NULL,
Low float NULL,
[close] float NULL,
Volume float NULL
);
SET @SQL = (SELECT N'
TRUNCATE TABLE #ticker_staging;
BULK INSERT #ticker_staging
FROM ''' + @Path + N'\' + ticker + N'.csv''
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '','', --CSV field delimiter
ROWTERMINATOR = ''\n'', --Use to shift the control to next row
TABLOCK
);
INSERT INTO dbo.all_tickers WITH (TABLOCKX)(
ticker_symbol,
[Date],
[Open],
High,
Low,
[close],
Volume
)
SELECT
''' + ticker + N''',
[Date],
[Open],
High,
Low,
[close],
Volume
FROM #ticker_staging;'
FROM dbo.symbols
FOR XML PATH(''), TYPE).value('.',N'nvarchar(MAX)');
EXECUTE sp_executesql @SQL;
GO
...但是如果您在