WWW::Mechanize在为html实体注册时遇到问题
我正在尝试获取此页面(以及其他类似页面)上的第一个(规则)链接。按照web 2.0标准,该链接的标记相当苛刻:WWW::Mechanize在为html实体注册时遇到问题,html,perl,html-entities,www-mechanize,Html,Perl,Html Entities,Www Mechanize,我正在尝试获取此页面(以及其他类似页面)上的第一个(规则)链接。按照web 2.0标准,该链接的标记相当苛刻: <A HREF="readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=1&pt=1&ch=3&rl=1" NAME="§3.1"> <font SIZ
<A HREF="readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=1&pt=1&ch=3&rl=1"
NAME="§3.1">
<font SIZE="4">§3.1</font>
</A>
我唯一能想到的是大写属性混淆了这一点。。。对于编写得更好的标记的其他琐碎测试允许我使用中的任何链接方法。有几分钟,我挠头,想知道我是否需要逃离符号。然后我切换到text_regex。。。但我觉得这个糟糕的字体标签把事情搞砸了
因此,我有两个相关的问题:首先,这些属性被假定为小写(它是如何看到href
的?)。第二,这里有没有我遗漏的明显的解决方法
[编辑]霍布斯是正确的,这是一个将实体机械化咀嚼回实际角色的案例。您无法获得原始源html。文字字符可能由于某些字符编码问题(毕竟是perl)而无法工作,但十六进制转义实现了这一点。如果你想填写答案,霍布斯,我会把它标记为正确答案
仍然在试图找出Stackoverflow的错误,我在一个关于你必须稍微聪明一点的问题上被否决了。。。我猜每个人都在试图得分或者做维基百科排斥主义的事情。也许是时候停止在这里提问了。我现在还不清楚为什么在
name
上搜索失败,我也是如此
但是,这些链接中url的结尾(用于“规则”)以与“名称”相同的方式标识它们,我们可以使用url\u regex=>qr/rl=\d+$/
来识别它们
use warnings 'all';
use strict;
use WWW::Mechanize;
my $url = 'your url';
my $mech = WWW::Mechanize->new();
$mech->get( $url ) or die "Can't get url: $!";
my @all_rules = $mech->find_all_links( url_regex => qr/rl=\d+$/ );
print "$_->url()\n" for @all_rules;
这将打印所有这10条规则的url(使用链接中的url)
另一种方式是获得页面上的第二张表格,从而将该内容与其他内容分开。然后将链接作为其
的唯一内容撬出。可以帮助解决这个问题,也可以绕过编码问题,因为我们可以获得原始HTML(测试)
更新 这个答案显然使用了不同的方法,而是搜索链接本身 因为有人解释说有“4000个单独的页面”,链接也不那么可靠,所以最好的方法可能是按照要求使用
name
属性。在这种情况下,我们应该考虑整个实体<代码>和>;代码>,如其他答案(以及作者的早期评论)所示
关于这个答案背后的理由的评论。在
name
属性中搜索HTML实体完全取决于特定字符,因此更全面的方法也应该有用。例如,可以识别所寻求内容中的模式(在本例中为链接文本),或者使用文档结构来关注内容(在本例中为表) 我现在还不清楚为什么在name
上搜索失败,我也是如此
但是,这些链接中url的结尾(用于“规则”)以与“名称”相同的方式标识它们,我们可以使用url\u regex=>qr/rl=\d+$/
来识别它们
use warnings 'all';
use strict;
use WWW::Mechanize;
my $url = 'your url';
my $mech = WWW::Mechanize->new();
$mech->get( $url ) or die "Can't get url: $!";
my @all_rules = $mech->find_all_links( url_regex => qr/rl=\d+$/ );
print "$_->url()\n" for @all_rules;
这将打印所有这10条规则的url(使用链接中的url)
另一种方式是获得页面上的第二张表格,从而将该内容与其他内容分开。然后将链接作为其
的唯一内容撬出。可以帮助解决这个问题,也可以绕过编码问题,因为我们可以获得原始HTML(测试)
更新 这个答案显然使用了不同的方法,而是搜索链接本身 因为有人解释说有“4000个单独的页面”,链接也不那么可靠,所以最好的方法可能是按照要求使用
name
属性。在这种情况下,我们应该考虑整个实体<代码>和>;代码>,如其他答案(以及作者的早期评论)所示
关于这个答案背后的理由的评论。在
name
属性中搜索HTML实体完全取决于特定字符,因此更全面的方法也应该有用。例如,可以识别所寻求内容中的模式(在本例中为链接文本),或者使用文档结构来关注内容(在本例中为表) 您有§
仅在HTML文档中,而不是文本字符串§代码>。因此,您的模式必须考虑到这一点
我要冒险去猜name\u regex=>qr/^\xa7\d+/
会成功的
#!/usr/bin/env perl
use strict;
use warnings;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new;
$mech->get( 'http://texreg.sos.state.tx.us/public/readtac$ext.ViewTAC?tac_view=5&ti=16&pt=1&ch=1&sch=A&rl=Y' );
my $n = 1;
while (my $link = $mech->find_link(name_regex => qr/^\xA7\d+/, n => $n++)) {
print $link->url, "\n"
}
输出:
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=1
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=2
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=3
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=4
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=5
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=6
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=7
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=8
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=9
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=10
PS:下次,请发布一个简短的、独立的脚本,其他人可以通过复制和粘贴而不是片段来运行它。你有§
仅在HTML文档中,而不是文本字符串§代码>。因此,您的模式必须考虑到这一点
我要冒险去猜name\u regex=>qr/^\xa7\d+/
会成功的
#!/usr/bin/env perl
use strict;
use warnings;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new;
$mech->get( 'http://texreg.sos.state.tx.us/public/readtac$ext.ViewTAC?tac_view=5&ti=16&pt=1&ch=1&sch=A&rl=Y' );
my $n = 1;
while (my $link = $mech->find_link(name_regex => qr/^\xA7\d+/, n => $n++)) {
print $link->url, "\n"
}
输出:
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=1
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=2
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=3
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=4
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=5
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=6
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=7
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=8
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=9
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=10
PS:下次,请发布一个简短的、自包含的脚本,其他人可以通过复制和粘贴而不是片段来运行该脚本。我不知道您在做什么,但此代码找到一个链接:
use strict;
use warnings;
use utf8;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new;
my $url = 'http://texreg.sos.state.tx.us/public/readtac$ext.ViewTAC?tac_view=5&ti=16&pt=1&ch=1&sch=A&rl=Y';
$mech->get($url);
if (my $link = $mech->find_link(name_regex => qr/^§\d/)) {
print "Found ", $link->url, "\n";
} else {
print "Not found\n";
}
输出:
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=1
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=2
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=3
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=4
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=5
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=6
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=7
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=8
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=9
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=10
Found readtac$ext.TacPage?sl=R&app=9&p\u dir=&p\u rloc=&p\u tloc=&p\u ploc=&pg=1&p\u tac=&ti=16&pt=1&ch=1&rl=1
我不知道您在做什么,但此代码找到一个链接:
use strict;
use warnings;
use utf8;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new;
my $url = 'http://texreg.sos.state.tx.us/public/readtac$ext.ViewTAC?tac_view=5&ti=16&pt=1&ch=1&sch=A&rl=Y';
$mech->get($url);
if (my $link = $mech->find_link(name_regex => qr/^§\d/)) {
print "Found ", $link->url, "\n";
} else {
print "Not found\n";
}
输出:
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=1
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=2
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=3
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=4
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=5
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=6
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=7
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=8
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=9
readtac$ext.TacPage?sl=R&app=9&p_dir=&p_rloc=&p_tloc=&p_ploc=&pg=1&p_tac=&ti=16&pt=1&ch=1&rl=10
Found readtac$ext.TacPage?sl=R&app=9&p\u dir=&p\u rloc=&p\u tloc=&p\u ploc=&pg=1&p\u tac=&ti=16&pt=1&ch=1&rl=1
正如其他人所说,问题在于WWW::Mechanize
扩展了实体§属性值中的code>,因此您应该寻找一个“剖面符号”字符§
我更喜欢名称silcrow,因为它与段落符号pilcrow