File Coverage

blib/lib/Novel/Robot/Parser/jjwxc.pm
Criterion Covered Total %
statement 44 110 40.0
branch 1 16 6.2
condition 1 9 11.1
subroutine 9 22 40.9
pod 0 12 0.0
total 55 169 32.5


line stmt bran cond sub pod time code
1             # ABSTRACT: https://www.jjwxc.net
2              
3             =pod
4              
5             =encoding utf8
6              
7             =head1 FUNCTION
8              
9             =cut
10              
11             package Novel::Robot::Parser::jjwxc;
12 1     1   5 use strict;
  1         2  
  1         29  
13 1     1   3 use warnings;
  1         1  
  1         47  
14 1     1   3 use utf8;
  1         2  
  1         5  
15 1     1   35 use base 'Novel::Robot::Parser';
  1         2  
  1         123  
16              
17 1     1   5 use Web::Scraper;
  1         2  
  1         9  
18 1     1   58 use Encode;
  1         2  
  1         1484  
19             #use Data::Dumper;
20             #use Smart::Comments;
21              
22 0     0 0 0 sub base_url { 'https://www.jjwxc.net' }
23              
24 0     0 0 0 sub domain { 'jjwxc.net' }
25              
26             sub generate_novel_url {
27 1     1 0 1 my ( $self, $index_url ) = @_;
28 1         5 my ( $novelid ) = $index_url =~ m#novelid=(\d+)#;
29 1 50       3 my $u = $novelid ? "https://m.jjwxc.net/book2/$novelid?more=0&whole=1" : $index_url;
30 1         3 return $u;
31             }
32              
33             sub parse_novel {
34 1     1 0 4 my ( $self, $h , $r) = @_;
35 1         38 $$h =~ s#本书霸王票读者排行.*##s;
36              
37 1         30 my ($title)= $$h=~m#(.+?)<\/title>#s; </td> </tr> <tr> <td class="h" > <a name="38">38</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 17 </td> <td class="s"> ( $r->{book}, $r->{writer} ) = $title =~ m#\s*《(.+?)》(.+?)_晋江文学城#s; </td> </tr> <tr> <td class="h" > <a name="39">39</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="40">40</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 80 </td> <td class="s"> my ( $cc ) = $$h =~ m#章节列表:<br/>.+?(<a.+?)<\/div>#s; </td> </tr> <tr> <td class="h" > <a name="41">41</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 63 </td> <td class="s"> my @f = $cc =~ m#<a.+?href="(.+?/\d+/\d+.*?)".+?>(.+?)</a>#sg; </td> </tr> <tr> <td class="h" > <a name="42">42</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> my $max_chapter_num = ( $#f + 1 ) / 2; </td> </tr> <tr> <td class="h" > <a name="43">43</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5 </td> <td class="s"> for my $i ( 1 .. $max_chapter_num ) { </td> </tr> <tr> <td class="h" > <a name="44">44</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 16 </td> <td class="s"> my $j = 2 * $i - 1; </td> </tr> <tr> <td class="h" > <a name="45">45</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 18 </td> <td class="s"> my $t = $f[$j]; </td> </tr> <tr> <td class="h" > <a name="46">46</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 38 </td> <td class="s"> $t =~ s/^\d+\.( )*//; </td> </tr> <tr> <td class="h" > <a name="47">47</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 41 </td> <td class="s"> $t =~ s/ / /g; </td> </tr> <tr> <td class="h" > <a name="48">48</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 50 </td> <td class="s"> $t =~ s/^.+>//; </td> </tr> <tr> <td class="h" > <a name="49">49</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 66 </td> <td class="s"> $t =~ s/\s+/ /g; </td> </tr> <tr> <td class="h" > <a name="50">50</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="51">51</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 21 </td> <td class="s"> my $ui = 2 * $i - 2; </td> </tr> <tr> <td class="h" > <a name="52">52</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 18 </td> <td class="s"> my $u = "https://m.jjwxc.net$f[$ui]"; </td> </tr> <tr> <td class="h" > <a name="53">53</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 16 </td> <td class="s"> push @{ $r->{item_list} }, { id => $i, title => $t, url => $u }; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 49 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="54">54</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="55">55</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="56">56</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 10 </td> <td class="s"> return $r; </td> </tr> <tr> <td class="h" > <a name="57">57</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } ## end sub parse_novel </td> </tr> <tr> <td class="h" > <a name="58">58</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="59">59</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub parse_novel_item { </td> </tr> <tr> <td class="h" > <a name="60">60</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#60-1"> 1 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#60-1"> 0 </a> </td> <td > 3 </td> <td class="s"> my ( $self, $h ) = @_; </td> </tr> <tr> <td class="h" > <a name="61">61</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="62">62</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 98 </td> <td class="s"> my ( $c ) = $$h =~ m#<h2[^>]+>.+?<li[^>]*>(.+?)</li>#s; </td> </tr> <tr> <td class="h" > <a name="63">63</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="64">64</a> </td> <td class="c3" > 1 </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--condition.html#64-1"> 50 </a> </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> return { content => $c || '' }; </td> </tr> <tr> <td class="h" > <a name="65">65</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="66">66</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="67">67</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub parse_board { </td> </tr> <tr> <td class="h" > <a name="68">68</a> </td> <td class="c0" > <a href="#71"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#68-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#68-1"> 0 </a> </td> <td >   </td> <td class="s"> my ( $self, $h ) = @_; </td> </tr> <tr> <td class="h" > <a name="69">69</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="70">70</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $parse_writer = scraper { </td> </tr> <tr> <td class="h" > <a name="71">71</a> </td> <td class="c0" > <a href="#72"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#71-1"> 0 </a> </td> <td >   </td> <td >   </td> <td class="s"> process_first '//tr[@valign="bottom"]//b', writer => 'TEXT'; </td> </tr> <tr> <td class="h" > <a name="72">72</a> </td> <td class="c0" > <a href="#73"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> }; </td> </tr> <tr> <td class="h" > <a name="73">73</a> </td> <td class="c0" > <a href="#75"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $ref = $parse_writer->scrape( $h ); </td> </tr> <tr> <td class="h" > <a name="74">74</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="75">75</a> </td> <td class="c0" > <a href="#76"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->tidy_string( $ref, 'writer' ); </td> </tr> <tr> <td class="h" > <a name="76">76</a> </td> <td class="c0" > <a href="#80"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return { writer => $ref->{writer} }; </td> </tr> <tr> <td class="h" > <a name="77">77</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="78">78</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="79">79</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub parse_board_item { </td> </tr> <tr> <td class="h" > <a name="80">80</a> </td> <td class="c0" > <a href="#81"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#80-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#80-1"> 0 </a> </td> <td >   </td> <td class="s"> my ( $self, $h ) = @_; </td> </tr> <tr> <td class="h" > <a name="81">81</a> </td> <td class="c0" > <a href="#82"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my @book_list; </td> </tr> <tr> <td class="h" > <a name="82">82</a> </td> <td class="c0" > <a href="#86"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $series = '未分类'; </td> </tr> <tr> <td class="h" > <a name="83">83</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="84">84</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $parse_writer = scraper { </td> </tr> <tr> <td class="h" > <a name="85">85</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> process '//tr[@bgcolor="#eefaee"]', 'book_list[]' => sub { </td> </tr> <tr> <td class="h" > <a name="86">86</a> </td> <td class="c0" > <a href="#87"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $tr = $_[0]; </td> </tr> <tr> <td class="h" > <a name="87">87</a> </td> <td class="c0" > <a href="#89"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $series = $self->parse_writer_series_name( $tr, $series ); </td> </tr> <tr> <td class="h" > <a name="88">88</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="89">89</a> </td> <td class="c0" > <a href="#90"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $book = $self->parse_writer_book_info( $tr, $series ); </td> </tr> <tr> <td class="h" > <a name="90">90</a> </td> <td class="c0" > <a href="#91"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--branch.html#90-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--condition.html#90-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> push @book_list, $book if ( $book and $book->{url} =~ /onebook/ ); </td> </tr> <tr> <td class="h" > <a name="91">91</a> </td> <td class="c0" > <a href="#92"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#91-1"> 0 </a> </td> <td >   </td> <td >   </td> <td class="s"> }; </td> </tr> <tr> <td class="h" > <a name="92">92</a> </td> <td class="c0" > <a href="#94"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> }; </td> </tr> <tr> <td class="h" > <a name="93">93</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="94">94</a> </td> <td class="c0" > <a href="#96"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $ref = $parse_writer->scrape( $h ); </td> </tr> <tr> <td class="h" > <a name="95">95</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="96">96</a> </td> <td class="c0" > <a href="#97"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->tidy_string( $ref, 'writer' ); </td> </tr> <tr> <td class="h" > <a name="97">97</a> </td> <td class="c0" > <a href="#99"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $_->{writer} = $ref->{writer} for @book_list; </td> </tr> <tr> <td class="h" > <a name="98">98</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="99">99</a> </td> <td class="c0" > <a href="#103"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return \@book_list; </td> </tr> <tr> <td class="h" > <a name="100">100</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } ## end sub parse_board_item </td> </tr> <tr> <td class="h" > <a name="101">101</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="102">102</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub parse_writer_series_name { </td> </tr> <tr> <td class="h" > <a name="103">103</a> </td> <td class="c0" > <a href="#105"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#103-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#103-1"> 0 </a> </td> <td >   </td> <td class="s"> my ( $self, $tr, $series ) = @_; </td> </tr> <tr> <td class="h" > <a name="104">104</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="105">105</a> </td> <td class="c0" > <a href="#107"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--branch.html#105-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return $series unless ( $tr->look_down( 'colspan', '7' ) ); </td> </tr> <tr> <td class="h" > <a name="106">106</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="107">107</a> </td> <td class="c0" > <a href="#108"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--branch.html#107-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> if ( $tr->as_trimmed_text =~ /【(.*)】/ ) { </td> </tr> <tr> <td class="h" > <a name="108">108</a> </td> <td class="c0" > <a href="#111"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $series = $1; </td> </tr> <tr> <td class="h" > <a name="109">109</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="110">110</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="111">111</a> </td> <td class="c0" > <a href="#115"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return $series; </td> </tr> <tr> <td class="h" > <a name="112">112</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="113">113</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="114">114</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub parse_writer_book_info { </td> </tr> <tr> <td class="h" > <a name="115">115</a> </td> <td class="c0" > <a href="#117"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#115-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#115-1"> 0 </a> </td> <td >   </td> <td class="s"> my ( $self, $tr, $series ) = @_; </td> </tr> <tr> <td class="h" > <a name="116">116</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="117">117</a> </td> <td class="c0" > <a href="#118"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $book = $tr->look_down( '_tag', 'a' ); </td> </tr> <tr> <td class="h" > <a name="118">118</a> </td> <td class="c0" > <a href="#120"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--branch.html#118-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return unless ( $book ); </td> </tr> <tr> <td class="h" > <a name="119">119</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="120">120</a> </td> <td class="c0" > <a href="#122"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $book_url = $book->attr( 'href' ); </td> </tr> <tr> <td class="h" > <a name="121">121</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="122">122</a> </td> <td class="c0" > <a href="#123"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $bookname = $book->as_trimmed_text; </td> </tr> <tr> <td class="h" > <a name="123">123</a> </td> <td class="c0" > <a href="#124"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> substr( $bookname, 0, 1 ) = ''; </td> </tr> <tr> <td class="h" > <a name="124">124</a> </td> <td class="c0" > <a href="#126"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--branch.html#124-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $bookname .= '[锁]' if ( $tr->look_down( 'color', 'gray' ) ); </td> </tr> <tr> <td class="h" > <a name="125">125</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="126">126</a> </td> <td class="c0" > <a href="#128"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $status = ( $tr->look_down( '_tag', 'td' ) )[4]->as_trimmed_text; </td> </tr> <tr> <td class="h" > <a name="127">127</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return { </td> </tr> <tr> <td class="h" > <a name="128">128</a> </td> <td class="c0" > <a href="#137"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> series => $series, </td> </tr> <tr> <td class="h" > <a name="129">129</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> book => "$bookname($status)", </td> </tr> <tr> <td class="h" > <a name="130">130</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> url => $self->base_url() . "/$book_url", </td> </tr> <tr> <td class="h" > <a name="131">131</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> }; </td> </tr> <tr> <td class="h" > <a name="132">132</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="133">133</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } ## end sub parse_writer_book_info </td> </tr> <tr> <td class="h" > <a name="134">134</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="135">135</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub make_query_request { </td> </tr> <tr> <td class="h" > <a name="136">136</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="137">137</a> </td> <td class="c0" > <a href="#138"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#137-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#137-1"> 0 </a> </td> <td >   </td> <td class="s"> my ( $self, $keyword, %opt ) = @_; </td> </tr> <tr> <td class="h" > <a name="138">138</a> </td> <td class="c0" > <a href="#140"> 0 </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--condition.html#138-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $opt{query_type} ||= '作品'; </td> </tr> <tr> <td class="h" > <a name="139">139</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="140">140</a> </td> <td class="c0" > <a href="#148"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my %qt = ( </td> </tr> <tr> <td class="h" > <a name="141">141</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> '作品' => '1', </td> </tr> <tr> <td class="h" > <a name="142">142</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> '作者' => '2', </td> </tr> <tr> <td class="h" > <a name="143">143</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> '主角' => '4', </td> </tr> <tr> <td class="h" > <a name="144">144</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> '配角' => '5', </td> </tr> <tr> <td class="h" > <a name="145">145</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> '其他' => '6', </td> </tr> <tr> <td class="h" > <a name="146">146</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> ); </td> </tr> <tr> <td class="h" > <a name="147">147</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="148">148</a> </td> <td class="c0" > <a href="#149"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $keyword = $self->encode_cjk_for_url($keyword); </td> </tr> <tr> <td class="h" > <a name="149">149</a> </td> <td class="c0" > <a href="#152"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $url = $self->base_url() . qq[/search.php?kw=$keyword&t=$qt{$opt{query_type}}]; </td> </tr> <tr> <td class="h" > <a name="150">150</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> #$url = encode( $self->charset(), $url ); </td> </tr> <tr> <td class="h" > <a name="151">151</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="152">152</a> </td> <td class="c0" > <a href="#156"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return $url; </td> </tr> <tr> <td class="h" > <a name="153">153</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } ## end sub make_query_request </td> </tr> <tr> <td class="h" > <a name="154">154</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="155">155</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub parse_query_list { </td> </tr> <tr> <td class="h" > <a name="156">156</a> </td> <td class="c0" > <a href="#159"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#156-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#156-1"> 0 </a> </td> <td >   </td> <td class="s"> my ( $self, $h ) = @_; </td> </tr> <tr> <td class="h" > <a name="157">157</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $parse_query = scraper { </td> </tr> <tr> <td class="h" > <a name="158">158</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> process '//div[@class="page"]/a', 'urls[]' => sub { </td> </tr> <tr> <td class="h" > <a name="159">159</a> </td> <td class="c0" > <a href="#160"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--branch.html#159-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return unless ( $_[0]->as_text =~ /^\[\d*\]$/ ); </td> </tr> <tr> <td class="h" > <a name="160">160</a> </td> <td class="c0" > <a href="#161"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $url = $self->base_url() . ( $_[0]->attr( 'href' ) ); </td> </tr> <tr> <td class="h" > <a name="161">161</a> </td> <td class="c0" > <a href="#162"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $url = encode( $self->charset(), $url ); </td> </tr> <tr> <td class="h" > <a name="162">162</a> </td> <td class="c0" > <a href="#163"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return $url; </td> </tr> <tr> <td class="h" > <a name="163">163</a> </td> <td class="c0" > <a href="#164"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#163-1"> 0 </a> </td> <td >   </td> <td >   </td> <td class="s"> }; </td> </tr> <tr> <td class="h" > <a name="164">164</a> </td> <td class="c0" > <a href="#165"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> }; </td> </tr> <tr> <td class="h" > <a name="165">165</a> </td> <td class="c0" > <a href="#166"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $r = $parse_query->scrape( $h ); </td> </tr> <tr> <td class="h" > <a name="166">166</a> </td> <td class="c0" > <a href="#170"> 0 </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--condition.html#166-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return $r->{urls} || []; </td> </tr> <tr> <td class="h" > <a name="167">167</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } ## </td> </tr> <tr> <td class="h" > <a name="168">168</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="169">169</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub parse_query_item { </td> </tr> <tr> <td class="h" > <a name="170">170</a> </td> <td class="c0" > <a href="#173"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#170-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#170-1"> 0 </a> </td> <td >   </td> <td class="s"> my ( $self, $h ) = @_; </td> </tr> <tr> <td class="h" > <a name="171">171</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="172">172</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $parse_query = scraper { </td> </tr> <tr> <td class="h" > <a name="173">173</a> </td> <td class="c0" > <a href="#180"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--subroutine.html#173-1"> 0 </a> </td> <td >   </td> <td >   </td> <td class="s"> process '//h3[@class="title"]/a', </td> </tr> <tr> <td class="h" > <a name="174">174</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 'books[]' => { </td> </tr> <tr> <td class="h" > <a name="175">175</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 'book' => 'TEXT', </td> </tr> <tr> <td class="h" > <a name="176">176</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 'url' => '@href', </td> </tr> <tr> <td class="h" > <a name="177">177</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> }; </td> </tr> <tr> <td class="h" > <a name="178">178</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="179">179</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> process '//div[@class="info"]', 'writers[]' => sub { </td> </tr> <tr> <td class="h" > <a name="180">180</a> </td> <td class="c0" > <a href="#181"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my ( $writer, $status ) = $_[0]->as_text =~ /作者:(.+?) \┃ 进度:(\S+)/s; </td> </tr> <tr> <td class="h" > <a name="181">181</a> </td> <td class="c0" > <a href="#182"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return { writer => $writer, status => $status }; </td> </tr> <tr> <td class="h" > <a name="182">182</a> </td> <td class="c0" > <a href="#183"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> }; </td> </tr> <tr> <td class="h" > <a name="183">183</a> </td> <td class="c0" > <a href="#184"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> }; </td> </tr> <tr> <td class="h" > <a name="184">184</a> </td> <td class="c0" > <a href="#186"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $ref = $parse_query->scrape( $h ); </td> </tr> <tr> <td class="h" > <a name="185">185</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="186">186</a> </td> <td class="c0" > <a href="#187"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my @result; </td> </tr> <tr> <td class="h" > <a name="187">187</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> foreach my $i ( 0 .. $#{ $ref->{books} } ) { </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#188"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="188">188</a> </td> <td class="c0" > <a href="#189"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $r = $ref->{books}[$i]; </td> </tr> <tr> <td class="h" > <a name="189">189</a> </td> <td class="c0" > <a href="#191"> 0 </a> </td> <td class="c0" > <a href="blib-lib-Novel-Robot-Parser-jjwxc-pm--branch.html#189-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> next unless ( $r->{url} ); </td> </tr> <tr> <td class="h" > <a name="190">190</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="191">191</a> </td> <td class="c0" > <a href="#192"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $w = $ref->{writers}[$i]; </td> </tr> <tr> <td class="h" > <a name="192">192</a> </td> <td class="c0" > <a href="#193"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $r->{title} .= "($w->{status})"; </td> </tr> <tr> <td class="h" > <a name="193">193</a> </td> <td class="c0" > <a href="#196"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> push @result, { %$w, %$r }; </td> </tr> <tr> <td class="h" > <a name="194">194</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="195">195</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="196">196</a> </td> <td class="c0" > 0 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return \@result; </td> </tr> <tr> <td class="h" > <a name="197">197</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } ## end sub parse_query_item </td> </tr> <tr> <td class="h" > <a name="198">198</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="199">199</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1; </td> </tr> </table> </body> </html>