1. package xsmeral.artnet.scraper;
  2.  
  3. import java.util.List;
  4. import java.util.regex.Matcher;
  5. import java.util.regex.Pattern;
  6. import org.htmlcleaner.TagNode;
  7. import org.openrdf.model.URI;
  8. import org.openrdf.model.vocabulary.RDF;
  9. import org.openrdf.model.vocabulary.RDFS;
  10. import xsmeral.semnet.crawler.model.EntityDocument;
  11. import xsmeral.semnet.scraper.AbstractScraper;
  12. import xsmeral.semnet.scraper.onto.EntityClass;
  13. import xsmeral.semnet.scraper.onto.Term;
  14. import xsmeral.semnet.util.XPathUtil;
  15.  
  16. public class DBKnih {
  17.  
  18.     public static class Kniha extends AbstractScraper {
  19.  
  20.         private static final Pattern PATT_ISBN = Pattern.compile("ISBN:\\s*([\\d-]+[\\d])");
  21.         private static final Pattern PATT_YEAR = Pattern.compile("Rok vydání:\\s*(\\d{4})");
  22.         public static final String NAMESPACE = "http://www.databazeknih.cz#";
  23.         @Term
  24.         public static final URI TYPE = RDF.TYPE;
  25.         @Term
  26.         @EntityClass
  27.         public static final URI BOOK = f.createURI(NAMESPACE, "book");
  28.         @Term
  29.         public static final URI TITLE = RDFS.LABEL;
  30.         @Term("Has author")
  31.         public static final URI AUTHOR = f.createURI(NAMESPACE, "author");
  32.         @Term
  33.         public static final URI YEAR = f.createURI(NAMESPACE, "year");
  34.         @Term
  35.         public static final URI ISBN = f.createURI(NAMESPACE, "isbn");
  36.  
  37.         @Override
  38.         public String getNamespace() {
  39.             return NAMESPACE;
  40.         }
  41.  
  42.         @Override
  43.         protected void scrape(EntityDocument doc) throws Exception {
  44.             TagNode bookNode = (TagNode) doc.getDocument().evaluateXPath("//*[@id='book']")[0];
  45.  
  46.             // state type of this entity
  47.             fact(TYPE, BOOK);
  48.  
  49.             // main name
  50.             String bookName = XPathUtil.queryText(bookNode, "h1[@class='bookname']");
  51.             fact(TITLE, lit(bookName));
  52.  
  53.             // original name
  54.             String otherName = XPathUtil.queryText(bookNode, "h2[@class='otitle']");
  55.             if (otherName != null) {
  56.                 fact(TITLE, lit(otherName));
  57.             }
  58.  
  59.             // author name(s)
  60.             for (String author : XPathUtil.queryTextNodes(bookNode, "h2[@class='jmenaautoru']/a/@href")) {
  61.                 fact(AUTHOR, uri(author));
  62.             }
  63.  
  64.             // year of publishing, ISBN
  65.             List<TagNode> bookInfoNodes = XPathUtil.queryNodes(bookNode, "span[@class='h5']");
  66.             if (bookInfoNodes.size() > 0) {
  67.                 String bookInfo = bookInfoNodes.get(0).getText().toString();
  68.                 Matcher m = PATT_YEAR.matcher(bookInfo);
  69.                 if (m.find()) {
  70.                     String year = m.group(1);
  71.                     if (year != null) {
  72.                         fact(YEAR, f.createLiteral(Integer.parseInt(year)));
  73.                     }
  74.                 }
  75.                 m = PATT_ISBN.matcher(bookInfo);
  76.                 if (m.find()) {
  77.                     String isbn = m.group(1);
  78.                     if (isbn != null) {
  79.                         fact(ISBN, lit(isbn));
  80.                     }
  81.                 }
  82.             }
  83.         }
  84.     }
  85.  
  86.     public static class Povidka extends AbstractScraper {
  87.  
  88.         private static final Pattern PATT_YEAR = Pattern.compile("Rok vydání originálu:\\s*(\\d{4})");
  89.         public static final String NAMESPACE = "http://www.databazeknih.cz#";
  90.         @Term
  91.         public static final URI TYPE = RDF.TYPE;
  92.         @Term
  93.         @EntityClass
  94.         public static final URI SHORT_STORY = f.createURI(NAMESPACE, "shortStory");
  95.         @Term
  96.         public static final URI PART_OF = f.createURI(NAMESPACE, "partOf");
  97.         @Term
  98.         public static final URI TITLE = RDFS.LABEL;
  99.         @Term("Has author")
  100.         public static final URI AUTHOR = f.createURI(NAMESPACE, "author");
  101.         @Term
  102.         public static final URI YEAR = f.createURI(NAMESPACE, "year");
  103.  
  104.         @Override
  105.         public String getNamespace() {
  106.             return NAMESPACE;
  107.         }
  108.  
  109.         @Override
  110.         protected void scrape(EntityDocument doc) throws Exception {
  111.             TagNode storyNode = (TagNode) doc.getDocument().evaluateXPath("//*[@id='tale']")[0];
  112.            
  113.             // state type of this entity
  114.             fact(TYPE, SHORT_STORY);
  115.  
  116.             // story name
  117.             String storyName = XPathUtil.queryText(storyNode, "h1[@class='bookname']");
  118.             fact(TITLE, lit(storyName));
  119.  
  120.             // original name
  121.             String otherName = XPathUtil.queryText(storyNode, "h2[@class='otitle']");
  122.             if (otherName != null) {
  123.                 fact(TITLE, lit(otherName));
  124.             }
  125.  
  126.             // year, authors, containing book
  127.             List<TagNode> storyInfoNodes = XPathUtil.queryNodes(storyNode, "h2[@class='jmenaautoru']");
  128.             for (TagNode storyInfoNode : storyInfoNodes) {
  129.                 List firstChildNodeList = storyInfoNode.getChildren();
  130.                 if (firstChildNodeList.size() > 0) {
  131.                     String firstChild = XPathUtil.getText(firstChildNodeList.get(0));
  132.                     if (firstChild != null && !firstChild.isEmpty()) {
  133.                         if (firstChild.startsWith("Kniha:")) {
  134.                             String href = XPathUtil.queryText(storyInfoNode, "a/@href");
  135.                             if (href != null) {
  136.                                 fact(PART_OF, uri(href));
  137.                             }
  138.                         } else if (firstChild.startsWith("Autor:")) {
  139.                             String href = XPathUtil.queryText(storyInfoNode, "a/@href");
  140.                             if (href != null) {
  141.                                 fact(AUTHOR, uri(href));
  142.                             }
  143.                         } else if (firstChild.startsWith("Rok vydání originálu:")) {
  144.                             Matcher m = PATT_YEAR.matcher(firstChild);
  145.                             if (m.find()) {
  146.                                 String yearStr = m.group(1);
  147.                                 fact(YEAR, f.createLiteral(Integer.parseInt(yearStr)));
  148.                             }
  149.                         }
  150.                     }
  151.                 }
  152.             }
  153.         }
  154.     }
  155.  
  156.     public static class Autor extends AbstractScraper {
  157.         // 1 - birth, 2 - death, 3 - country
  158.         private static final Pattern PATT_ORIGIN = Pattern.compile("\\((\\d{4})(?:\\s*-\\s*(\\d{4}))?\\),?\\s*(.*)");
  159.         public static final String NAMESPACE = "http://www.databazeknih.cz#";
  160.         @Term
  161.         public static final URI TYPE = RDF.TYPE;
  162.         @Term
  163.         @EntityClass
  164.         public static final URI WRITER = f.createURI(NAMESPACE, "writer");
  165.         @Term
  166.         public static final URI NAME = RDFS.LABEL;
  167.         @Term
  168.         public static final URI PSEUDONYM = f.createURI(NAMESPACE, "pseudonym");
  169.         @Term
  170.         public static final URI BIRTH_DATE = f.createURI(NAMESPACE, "birthDate");
  171.         @Term
  172.         public static final URI DEATH_DATE = f.createURI(NAMESPACE, "deathDate");
  173.         @Term
  174.         public static final URI COUNTRY = f.createURI(NAMESPACE, "country");
  175.  
  176.         @Override
  177.         public String getNamespace() {
  178.             return NAMESPACE;
  179.         }
  180.  
  181.         @Override
  182.         protected void scrape(EntityDocument doc) throws Exception {
  183.             TagNode authorNode = (TagNode) doc.getDocument().evaluateXPath("//*[@id='author']")[0];
  184.  
  185.             // state type of this entity
  186.             fact(TYPE, WRITER);
  187.  
  188.             // author name
  189.             String authorName = XPathUtil.queryText(authorNode, "h1[1]");
  190.             fact(NAME, lit(authorName));
  191.  
  192.             //pseudonym
  193.             String pseudonym = XPathUtil.queryText(authorNode, "h2[@class='pseudonym']");
  194.             if (pseudonym != null) {
  195.                 fact(PSEUDONYM, lit(pseudonym));
  196.             }
  197.             // dates and origin
  198.             String datesAndOrigin = XPathUtil.queryText(authorNode, "h2[@class='bookname']");
  199.             if (datesAndOrigin != null) {
  200.                 Matcher m = PATT_ORIGIN.matcher(datesAndOrigin);
  201.                 if(m.find()) {
  202.                     String birth = m.group(1);
  203.                     String death = m.group(2);
  204.                     String country = m.group(3);
  205.                     if (birth != null) {
  206.                         fact(BIRTH_DATE, f.createLiteral(Integer.parseInt(birth)));
  207.                     }
  208.                     if (death != null) {
  209.                         fact(DEATH_DATE, f.createLiteral(Integer.parseInt(death)));
  210.                     }
  211.                     if (country != null) {
  212.                         fact(COUNTRY, lit(country));
  213.                     }
  214.                 }
  215.             }
  216.         }
  217.     }
  218. }
  219.