gpt4 book ai didi

html - 从 Perl 中的 HTMl/XML 标签中提取文本

转载 作者:数据小太阳 更新时间:2023-10-29 02:50:52 25 4
gpt4 key购买 nike

我有一个像这样的 HTTPS 响应

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Some tittle &lt;localconfig&gt;
&lt;key name="ssl_default"&gt;
&lt;value&gt;sha256&lt;/value&gt;
&lt;/key&gt;

</title>
</head>
<body>
<h2>Some h2</h2>
<p>some text:

<pre> text &lt;localconfig&gt;
&lt;key name="ssl_default"&gt;
&lt;value&gt;sha256&lt;/value&gt;
&lt;/key&gt;
&lt;key name="some variable"&gt;
&lt;value&gt;1024&lt;/value&gt;
&lt;/key&gt;
&lt;/localconfig&gt;
</pre>
</p>
<hr>
<i>
<small>Some text</small>
</i>
<hr/>
</body>
</html>
  • 键的名称是静态的,我需要使用变量来获取特定的值。
  • 我正在使用 decide_entities 将文本解析为 html
  • 有时 key 会在响应中发布两次,但它的值是相同的。

XML::LibXML 在这里没有多大帮助,因为它不是正确的 XML 文件/字符串。

我试着用正则表达式来得到它

sub get_key {
my $start = '<key name="'.$_[0].'">\n<value>';
print $_[1];
my $end = "</value>";
print " [*] Trying to get $_[0]\n";
print "Start: $start --- End $end";
if($_[1] =~ /\b$start\b(.*?)\b$end\b/s){
my $result = $1;
print $result, "\n\n";
return $result;
}
}

get_key("string_to_search", $string_from_response);

我需要提取key和value之间的key

<key name="variable">
<value>Grab me</value>
</key>

最佳答案

提取嵌入的 XML 文档后,您应该使用适当的 XML 解析器。

use XML::LibXML qw( );

my $xml_doc = XML::LibXML->new->parse_string($xml);

for my $key_node ($xml_doc->findnodes("/localconfig/key")) {
my $key = $key_node->getAttribute("name");
my $val = $key_node->findvalue("value/text()");
say "$key: $val";
}

所以这给我们留下了如何提取 XML 文档的问题。

选项 1:XML::LibXML

您可以使用 XML::LibXML 并简单地告诉它忽略错误(虚假的 </p> 标记)。

my $html_doc = XML::LibXML->new( recover => 2 )->parse_html_fh($html);
my $xml = encode_utf8( $html_doc->findvalue('/html/body/pre/text()') =~ s/^[^<]*//r );

选项 2:正则表达式匹配

您可能可以使用正则表达式模式匹配。

use HTML::Entities qw( decode_entities );

my $xml = decode_entities( ( $html =~ m{<pre>[^&]*(.*?)</pre>}s )[0] );

选项 3:Mojo::DOM

您可以使用 Mojo::DOM 来提取嵌入的 XML 文档。

use Encode    qw( decode encode_utf8 );
use Mojo::DOM qw( );

my $decoded_html = decode($encoding, $html);
my $html_doc = Mojo::DOM->new($decoded_html);
my $xml = encode_utf8( $html_doc->at('html > body > pre')->text =~ s/^[^<]*//r );

Mojo::DOM 的问题在于,在将文档传递给解析器之前,您需要知道文档的编码(因为您必须将其解码后传递),但您需要解析文档以提取文档编码形成文档。

(当然,您也可以使用 Mojo::DOM 来解析 XML。)


注意 HTML 片段 <p><pre></pre></p>表示 <p></p><pre></pre> , 并且 XML::LibXML 和 Mojo::DOM 都能正确处理这个问题。

关于html - 从 Perl 中的 HTMl/XML 标签中提取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56799085/

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