Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl正则表达式从HTML文件中提取信息?_Html_Xml_Regex_Perl - Fatal编程技术网

如何使用Perl正则表达式从HTML文件中提取信息?

如何使用Perl正则表达式从HTML文件中提取信息?,html,xml,regex,perl,Html,Xml,Regex,Perl,我有两个文件,XML和HTML,需要从这些文件中提取特定模式的数据 我的XML文件格式非常好,我可以使用readline读取一行并在标记之间搜索数据 if($line =~ /\<tag1\>$varvalue\<\/tag1\>/)` if($line=~/\$varvalue\/)` 但是,对于我的HTML,它的代码是我见过的最糟糕的代码之一,文件如下所示: <div class="theater"> <h2> <a

我有两个文件,XML和HTML,需要从这些文件中提取特定模式的数据

我的XML文件格式非常好,我可以使用readline读取一行并在标记之间搜索数据

if($line =~ /\<tag1\>$varvalue\<\/tag1\>/)`
if($line=~/\$varvalue\/)`
但是,对于我的HTML,它的代码是我见过的最糟糕的代码之一,文件如下所示:

<div class="theater">
    <h2>
    <a href="/showtimes/university-village-3" >**University Village 3**</a></h2>
    <div class="address">
        <i>**3323 South Hoover Street, Los Angeles CA 90007 | (213) 748-6321**</i>
    </div>
</div>

<div class="mtitle">
    <a href="/movie/dream-house-2011"  title="Dream House" onmouseover="mB(event, 771204354);"  >**Dream House**</a>
    <span>**(PG-13 , 1 hr. 31 min.)**</span>
</div>

<div class="times">

    **1:00 PM,**
</div>

**加利福尼亚州洛杉矶南胡佛街3323号90007 |(213)748-6321**
**(第13页,1小时31分钟)**
**下午一时**
现在我需要从这个文件中选择以粗体显示的数据

我可以使用Perl正则表达式从该文件中搜索数据。

当你读完这些后,你会回来:)

编辑:要真正解决您的问题,请查看此模块:

解析html文件的一些示例:

#!/usr/local/bin/perl

use HTML::TreeBuilder;

$tree = HTML::TreeBuilder->new;
$tree->parse_file('C:\Users\Stefanos\workspace\HTML_Parser_Test\test.html');

@divs = $tree->find('div');

$tree->delete;
在本例中,我只是将您的标记用作.html文件的主体。div存储在@divs数组中。因为我不知道你想找哪一个文本,因为**不是一个元素,所以我无法进一步帮助你

另外,我从来没有使用过这个模块,但我只用了5分钟就完成了,所以解析html文件并找到你想要的东西并不难

将任何特定标记和内容存储结果匹配为$1的正则表达式:

if ($subject =~ m!<tagname[^>]*>(.*?)</tagname>!s) {
    # Successful match
}
if($subject=~m!]*>(**?)s){
#成功的比赛
}
虽然当您使用嵌套元素时,您很快就会意识到这种方法的局限性

用实际标记替换标记名。。e、 g.在您的示例i、a、span、div中,尽管对于div,您还将获得第一个div的内容,而这不是您想要的内容。

当你读完这些后,你会回来:)

编辑:要真正解决您的问题,请查看此模块:

解析html文件的一些示例:

#!/usr/local/bin/perl

use HTML::TreeBuilder;

$tree = HTML::TreeBuilder->new;
$tree->parse_file('C:\Users\Stefanos\workspace\HTML_Parser_Test\test.html');

@divs = $tree->find('div');

$tree->delete;
在本例中,我只是将您的标记用作.html文件的主体。div存储在@divs数组中。因为我不知道你想找哪一个文本,因为**不是一个元素,所以我无法进一步帮助你

另外,我从来没有使用过这个模块,但我只用了5分钟就完成了,所以解析html文件并找到你想要的东西并不难

将任何特定标记和内容存储结果匹配为$1的正则表达式:

if ($subject =~ m!<tagname[^>]*>(.*?)</tagname>!s) {
    # Successful match
}
if($subject=~m!]*>(**?)s){
#成功的比赛
}
虽然当您使用嵌套元素时,您很快就会意识到这种方法的局限性

用实际标记替换标记名。。e、 g.在您的示例i、a、span、div中,尽管对于div,您还将获得第一个div的内容,而这不是您想要的内容。

。有许多简单易用的Perl模块用于解析HTML。这里有一些有用的东西。我省略了将电影和放映时间与影院关联的代码(因为我无意构建适当的输入文件):

#/usr/bin/env perl
严格使用;使用警告;
使用HTML::TokeParser::Simple;
my$parser=HTML::TokeParser::Simple->new(句柄=>\*数据);
我的剧院;
while(my$div=$parser->get_标记('div')){
my$class=$div->get_attr('class');
下一步,除非定义($class)和$class eq‘剧院’;
我的%记录;
$record{theater}=$parser->get_text('/a');
$record{address}=$parser->get_text('/i');
s{(?:^\s+)|(?:\s+\z)}{}用于值%record;
按@剧院,\%录制;
}
使用YAML;
打印转储\@影院;
__资料__
**加利福尼亚州洛杉矶南胡佛街3323号90007 |(213)748-6321**
**(第13页,1小时31分钟)**
**下午一时**
**明尼苏达州圣保罗市南胡佛街1234号99999 |(999)748-6321**
输出:

[sinan@macardy]:~/tmp> ./tt.pl --- - address: '**3323 South Hoover Street, Los Angeles CA 90007 | (213) 748-6321**' theater: '**University Village 3**' - address: '**1234 South Hoover Street, St Paul, MN 99999 | (999) 748-6321**' theater: '**Some other theater*' [sinan@macardy]:~/tmp>/tt.pl --- -地址:“**加利福尼亚州洛杉矶南胡佛街3323号90007 |(213)748-6321**” 剧院:“**大学村3**” -地址:“**明尼苏达州圣保罗市南胡佛街1234号99999 |(999)748-6321**” 剧院:“**其他剧院*”。有许多简单易用的Perl模块用于解析HTML。这里有一些有用的东西。我省略了将电影和放映时间与影院关联的代码(因为我无意构建适当的输入文件):

#/usr/bin/env perl
严格使用;使用警告;
使用HTML::TokeParser::Simple;
my$parser=HTML::TokeParser::Simple->new(句柄=>\*数据);
我的剧院;
while(my$div=$parser->get_标记('div')){
my$class=$div->get_attr('class');
下一步,除非定义($class)和$class eq‘剧院’;
我的%记录;
$record{theater}=$parser->get_text('/a');
$record{address}=$parser->get_text('/i');
s{(?:^\s+)|(?:\s+\z)}{}用于值%record;
按@剧院,\%录制;
}
使用YAML;
打印转储\@影院;
__资料__
**加利福尼亚州洛杉矶南胡佛街3323号90007 |(213)748-6321**
**(第13页,1小时31分钟)**
**下午一时**
**明尼苏达州圣保罗市南胡佛街1234号99999 |(999)748-6321**
输出:

[sinan@macardy]:~/tmp> ./tt.pl --- - address: '**3323 South Hoover Street, Los Angeles CA 90007 | (213) 748-6321**' theater: '**University Village 3**' - address: '**1234 South Hoover Street, St Paul, MN 99999 | (999) 748-6321**' theater: '**Some other theater*' [sinan@macardy]:~/tmp>/tt.pl --- -地址:“**加利福尼亚州洛杉矶南胡佛街3323号90007 |(213)748-6321**” 剧院:“**大学村3**” -地址:“**明尼苏达州圣保罗市南胡佛街1234号99999 |(999)748-6321**”
剧院:“**其他剧院*”我希望这对我有帮助。。。非常感谢@FailedDev问题是我只需要用正则表达式就可以了,而且似乎只有库和解析器才能做到这一点?@typedef1如果你用正则表达式就可以了,那么你的解决方案只能解决一个非常具体的问题,而且很容易崩溃。为什么使用图书馆这么糟糕?在那里大部分的腿部工作已经为您完成。我的项目要求。。。我对各种各样的东西和组合都很着迷。。。虽然我读到乔恩·斯基特也做不到,但我相信一定有适合我的东西@FailedDEv@type-你有没有跟老板解释过**你不应该解析HTML-这是一种非常规语法