代码之家  ›  专栏  ›  技术社区  ›  l0b0

如何使用perl将isbn替换为marc文件中的google books id?

  •  1
  • l0b0  · 技术社区  · 16 年前

    我有一个文件,里面有一些图书资料 MARC 格式,其中一些行是ISBNS。如果有的话,我想用那个ISBN的谷歌图书ID替换这些行。这是迄今为止的代码,它只是删除了行:

    perl -pe "s#ISBN(.*)#$(wget --output-document=- --quiet --user-agent=Mozilla/5.0 \"http://books.google.com/books?jscmd=viewapi&bibkeys=\1\")#mg" < 5-${file} > 6-${file}

    PS:谷歌在自动化工具的使用上有点模糊: Books Data API 建议使用curl/wget等工具,但在使用此类工具时,没有关于如何避免被阻塞的说明。我也很确定我在TOS中看到一个子句,说用户不能发送自动查询,但我再也找不到它了。这是 discussed 在他们的论坛上。

    2 回复  |  直到 16 年前
        1
  •  1
  •   mob    16 年前

    我认为OP在正确的轨道上,可以使用一个一行程序来实现这一点,只需要用正确的Perl语法替换一些bash风格的语法。我认为这是可行的(为了可读性增加了新行):

        perl -pe 's#ISBN(\w+)#qx(wget --output-document=- 
            --quiet --user-agent=Mozilla/5.0 
            "http://books.google.com/books\\?jscmd=viewapi\\&bibkeys=$1")#ge' \
            < 5-${file} > 6-${file}
    

    你必须逃逸(编辑:双重逃逸似乎有效) $ & URL中的字符。

        2
  •  5
  •   Sinan Ünür    16 年前

    你最终不得不对用户代理撒谎的原因是你违反了谷歌的操作系统:不要这样做。

    相反,使用 Google Book Search API .

    下面的代码由于我不熟悉诸如 XML::Atom , Data::Feed ,请 WWW::OpenSearch . 但是,它应该提供一个良好的起点。

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use Business::ISBN qw( valid_isbn_checksum );
    use LWP::Simple;
    use XML::Simple;
    
    while ( <> ) {
        s/ISBN:([0-9]+)/'Google Books ID:' . get_google_id_for_isbn($1)/ge;
        print;
    }
    
    use Carp;
    
    sub make_google_books_query {
        sprintf 'http://books.google.com/books/feeds/volumes?q=isbn:%s', $_[0];
    }
    
    sub get_google_id_for_isbn {
        my ($isbn) = @_;
    
        my $google_id = eval {
            defined(valid_isbn_checksum $isbn)
                or croak "Invalid ISBN: $isbn";
    
            my $query = make_google_books_query($isbn);
            my $xml = get $query;
    
            defined($xml)
                or croak "No response to <$query>";
    
            my $data = XMLin($xml, ForceArray => 1);
            my @ids = @{ $data->{entry}[0]{'dc:identifier'} };
    
            unless ("ISBN:$isbn" eq $ids[1]
                    or "ISBN:$isbn" eq $ids[2] ) {
                croak "Invalid search results: '@ids'";
            }
    
            $ids[0];
        };
    
        defined($google_id) ? $google_id : '';
    }
    

    给定文本文件 t.txt 包含:

    ISBN:0060930314
    ISBN:9780596520106
    

    它输出:

    Google Books ID:ioXFqlzsmK8C
    Google Books ID:lNVHi3TunxsC
    
    推荐文章