嗨,我试图从网址获取主机.
sub scrape {
my @m_error_array;
my @m_href_array;
my @href_array;
my ( $self, $DBhost, $DBuser, $DBpass, $DBname ) = @_;
my ($dbh, $query, $result, $array);
my $DNS = "dbi:mysql:$DBname:$DBhost:3306";
$dbh = DBI->connect($DNS, $DBuser, $DBpass ) or die $DBI::errstr;
if( defined( $self->{_process_image} ) && ( -e 'href_w_' . $self->{_process_image} . ".txt" ) ) {
open ERROR_W, "error_w_" . $self->{_process_image} . ".txt";
open M_HREF_W, "m_href_w_" . $self->{_process_image} . ".txt";
open HREF_W, "href_w_" . $self->{_process_image} . ".txt";
@m_error_array = ( split( '|||', <ERROR_W> ) );
@m_href_array = ( split( '|||', <M_HREF_W> ) );
@href_array = ( split( '|||', <HREF_W> ) );
close ( ERROR_W );
close ( M_HREF_W );
close ( HREF_W );
}else{
@href_array = ( $self->{_url} );
}
my $z = 0;
while( @href_array ){
if( defined( $self->{_x_more} ) && $z == $self->{_x_more} ) {
last;
}
if( defined( $self->{_process_image} ) ) {
$self->write( 'm_href_w', @m_href_array );
$self->write( 'href_w', @href_array );
$self->write( 'error_w', @m_error_array );
}
$self->{_link_count} = scalar @m_href_array;
my $href = shift( @href_array );
my $info = URI->new($href);
my $host = $info->host;
$host =~ s/^www\.//;
$result = $dbh->prepare("INSERT INTO `". $host ."` (URL) VALUES ('$href')");
if( ! $result->execute() ){
$result = $dbh->prepare("CREATE TABLE `" . $host . "` ( `ID` INT( 255 ) NOT NULL AUTO_INCREMENT , `URL` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `ID` )) ENGINE = MYISAM ;");
$result->execute()
}
$self->{_current_page} = $href;
my $response = $ua->get($href);
my $responseCode = $response->code;
print $responseCode;
}
Run Code Online (Sandbox Code Playgroud)
}
线路my $host = $info->host;正在投掷Can't locate object method "host" via package "URI::_generic"
有谁能解释一下?
问候,
菲尔
raf*_*afl 10
URI->new创建子类的实例URI,具体取决于您提供的URL的方案.这些子类可能是URI::http,URI::file,URI::mailto,或完全不同的东西.如果URI没有为您提供的url类型设置专门的子类,那么它将创建一个实例URI::_generic.
每个URI子类都有不同的方法.URI::http碰巧有一种host方法,但大多数其他方法没有.你正在呼唤->host一些不是URI::http或类似的东西,因此没有host方法.
您可能希望传递给的所有字符串URI->new都是http网址.情况似乎并非如此,因此您可能需要检查数据.否则,如果您确实想要处理非http URL,则应在确认该实例之前确保该实例存在一个方法,例如使用->can或->isa.
| 归档时间: |
|
| 查看次数: |
3650 次 |
| 最近记录: |