├── .gitignore ├── LICENSE ├── Papers ├── 2009_5_6_1757_1766.pdf ├── 3-Vision-Based-Deep-Web-Data-Extraction.pdf ├── Boilerplate detection.pdf ├── Clustering based algo.pdf ├── Content Extraction using DOM.pdf ├── FiVaTechCameraReady.pdf ├── Nested Data record extraction.pdf ├── Some novel technique.pdf ├── Survey.pdf ├── ViDE Based method.pdf ├── ViDE.pdf ├── ViPER.pdf ├── ViPS Technical Report.pdf ├── Vision based data extraction.pdf ├── Visual Segmentation of web page.pdf └── nested-extract.pdf ├── README.md ├── projectname.egg-info ├── PKG-INFO ├── SOURCES.txt ├── dependency_links.txt ├── requires.txt └── top_level.txt ├── pynet ├── .net.py.swp ├── __init__.py ├── __init__.pyc ├── net.py ├── net.pyc ├── output ├── output.csv ├── output.out ├── tree.py ├── tree.pyc └── tree.py~ ├── setup.py └── tests ├── __init__.py ├── pynet_tests.py ├── resources ├── 1.html ├── 2.html ├── 3.html ├── 4.html ├── 5.html ├── 6.html └── test.html ├── test_net.py └── test_tree.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | env/ 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | *.egg-info/ 23 | .installed.cfg 24 | *.egg 25 | 26 | # PyInstaller 27 | # Usually these files are written by a python script from a template 28 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 29 | *.manifest 30 | *.spec 31 | 32 | # Installer logs 33 | pip-log.txt 34 | pip-delete-this-directory.txt 35 | 36 | # Unit test / coverage reports 37 | htmlcov/ 38 | .tox/ 39 | .coverage 40 | .coverage.* 41 | .cache 42 | nosetests.xml 43 | coverage.xml 44 | *,cover 45 | 46 | # Translations 47 | *.mo 48 | *.pot 49 | 50 | # Django stuff: 51 | *.log 52 | 53 | # Sphinx documentation 54 | docs/_build/ 55 | 56 | # PyBuilder 57 | target/ 58 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Shashank Gupta 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Papers/2009_5_6_1757_1766.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/2009_5_6_1757_1766.pdf -------------------------------------------------------------------------------- /Papers/3-Vision-Based-Deep-Web-Data-Extraction.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/3-Vision-Based-Deep-Web-Data-Extraction.pdf -------------------------------------------------------------------------------- /Papers/Boilerplate detection.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/Boilerplate detection.pdf -------------------------------------------------------------------------------- /Papers/Clustering based algo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/Clustering based algo.pdf -------------------------------------------------------------------------------- /Papers/Content Extraction using DOM.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/Content Extraction using DOM.pdf -------------------------------------------------------------------------------- /Papers/FiVaTechCameraReady.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/FiVaTechCameraReady.pdf -------------------------------------------------------------------------------- /Papers/Nested Data record extraction.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/Nested Data record extraction.pdf -------------------------------------------------------------------------------- /Papers/Some novel technique.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/Some novel technique.pdf -------------------------------------------------------------------------------- /Papers/Survey.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/Survey.pdf -------------------------------------------------------------------------------- /Papers/ViDE Based method.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/ViDE Based method.pdf -------------------------------------------------------------------------------- /Papers/ViDE.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/ViDE.pdf -------------------------------------------------------------------------------- /Papers/ViPER.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/ViPER.pdf -------------------------------------------------------------------------------- /Papers/ViPS Technical Report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/ViPS Technical Report.pdf -------------------------------------------------------------------------------- /Papers/Vision based data extraction.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/Vision based data extraction.pdf -------------------------------------------------------------------------------- /Papers/Visual Segmentation of web page.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/Visual Segmentation of web page.pdf -------------------------------------------------------------------------------- /Papers/nested-extract.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/Papers/nested-extract.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pynet 2 | Web Data Extraction from Flat and Nested Records. This is an attempt to build an automated data extraction system which extracted records following similar pattern from a web page without writing any code. Example of such web pages are E-commerce web pages with records of products, web pages with user reviews of product or any page which has data records following same pattern. 3 | 4 | # System Design 5 | It follows the research paper titled "NET- A system for Extracting Web Data from Flat and Nested Data Records". Reference of the paper is: 6 | Bing Liu and Yanhong Zhai. "NET - A System for Extracting Web Data from Flat and Nested Data Records." Proceedings of 6th International Conference on Web Information Systems Engineering (WISE-05), 2005 7 | 8 | # Requirements 9 | 1. lxml 10 | 2. StringIO 11 | 3. requests 12 | 13 | # Running Command 14 | From the folder net run the following command
15 | python net.py web / Standard mode, pass URL
16 | python net.py local /If you have html page saved on local disk 17 | 18 | # Future Work 19 | I have tried to follow the paper I mentioned for designing the system, but unfortunately it doesn't works very well. If you run the program you will get some output related to some text from the program but it is not structured properly. This is version 1.0 of the system. I will try to update it incrementally to work properly. 20 | In case you are interested in this project do send me a pull request. Thanks !! 21 | 22 | -------------------------------------------------------------------------------- /projectname.egg-info/PKG-INFO: -------------------------------------------------------------------------------- 1 | Metadata-Version: 1.1 2 | Name: projectname 3 | Version: 0.1 4 | Summary: My Project 5 | Home-page: URL to get it at. 6 | Author: My Name 7 | Author-email: My email. 8 | License: UNKNOWN 9 | Download-URL: Where to download it. 10 | Description: UNKNOWN 11 | Platform: UNKNOWN 12 | -------------------------------------------------------------------------------- /projectname.egg-info/SOURCES.txt: -------------------------------------------------------------------------------- 1 | setup.py 2 | projectname.egg-info/PKG-INFO 3 | projectname.egg-info/SOURCES.txt 4 | projectname.egg-info/dependency_links.txt 5 | projectname.egg-info/requires.txt 6 | projectname.egg-info/top_level.txt 7 | pynet/__init__.py 8 | pynet/net.py 9 | pynet/tree.py -------------------------------------------------------------------------------- /projectname.egg-info/dependency_links.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /projectname.egg-info/requires.txt: -------------------------------------------------------------------------------- 1 | nose -------------------------------------------------------------------------------- /projectname.egg-info/top_level.txt: -------------------------------------------------------------------------------- 1 | pynet 2 | -------------------------------------------------------------------------------- /pynet/.net.py.swp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/pynet/.net.py.swp -------------------------------------------------------------------------------- /pynet/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/pynet/__init__.py -------------------------------------------------------------------------------- /pynet/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/pynet/__init__.pyc -------------------------------------------------------------------------------- /pynet/net.py: -------------------------------------------------------------------------------- 1 | from tree import tree as tree 2 | from lxml import etree 3 | import requests 4 | from lxml import html 5 | import json 6 | import sys 7 | import csv 8 | import logging 9 | import time 10 | 11 | class NET(object): 12 | 13 | def __init__(self, url, source = "web"): 14 | 15 | f = open("output.csv", "wb") 16 | self.writer = csv.writer(f) 17 | self.tree = tree() 18 | self.full_matching = {} #helpful to create table 19 | 20 | #log configuration 21 | logging.basicConfig(filename = 'log.log', level = logging.INFO) 22 | 23 | if source == "web": 24 | try: 25 | page = requests.get(url) 26 | except requests.exceptions.RequestException as e: 27 | print e 28 | sys.exit(1) 29 | self.dom_tree = html.fromstring(page.content) 30 | else: 31 | self.dom_tree = etree.parse(url).getroot() 32 | 33 | print "======================Dom Tree========================" 34 | print self.dom_tree.getchildren() 35 | print "======================================================" 36 | print "\n\n" 37 | 38 | #TODO add other relevant logging info 39 | logging.info("url {0}".format(url)) 40 | logging.info("dom tree size {0}".format(self.tree.get_size(self.dom_tree))) 41 | 42 | def net(self, Threshold=3): 43 | start = time.clock() 44 | self.traverse(self.dom_tree, Threshold) 45 | print "==================== Tree Travesal Time ==============" 46 | print time.clock() - start 47 | print "======================================================" 48 | print "\n\n" 49 | 50 | 51 | #TODO: Use different heuristics, as mentioned in paper or find emperically 52 | def traverse(self, root, Threshold=25): 53 | 54 | if self.tree.get_depth(root) >= 3: 55 | for child in root.getchildren(): 56 | self.traverse(child, Threshold) 57 | 58 | self.full_matching = {} 59 | self.match(root, Threshold) 60 | 61 | # Create a table structure to write in a file the data 62 | table = [] 63 | for k,v in self.full_matching.iteritems(): 64 | if len(v)!=0: 65 | v.append(k) 66 | temp = [] 67 | if v is not None: 68 | for e in reversed(v): 69 | if e.text and e.text.strip(): 70 | print e.text.strip() 71 | temp.append(e.text.encode('utf-8').strip()) 72 | if len(temp)!=0: 73 | table.append(temp) 74 | 75 | if len(table)!=0: 76 | print "------------TABLE-----------------" 77 | print table 78 | 79 | #print zip(*table) 80 | # It is not a balanced structure(every list is of different size) so creating a balance 81 | N = max(map(lambda x:len(x), table)) 82 | 83 | print N, len(table) 84 | final_output = [['']*N]*len(table) 85 | for i in range(len(table)): 86 | for j in range(len(table[i])): 87 | final_output[i] = table[i][j] 88 | #print final_output 89 | self.writer.writerows(zip(*table)) 90 | 91 | 92 | def match(self, node, Threshold): 93 | matched = [] 94 | # Boolean vector to keep track of which nodes are matched to avoid 95 | # duplicate matching 96 | track_matches = {} 97 | children = node.getchildren() 98 | for child in children: 99 | track_matches[child] = 0 100 | for childF in children: 101 | for childR in children: 102 | if childF != childR: 103 | # Keep matching of two trees 104 | matched = [] 105 | if self.tree.tree_match(childF, childR, matched) >= Threshold and track_matches[childR]!=1: 106 | #for matching in matched: 107 | # if matching[0].text.encode('utf-8') is not None and matching[1].text.encode('utf-8') is not None and matching[0].text.encode('utf-8').isspace() is False and matching[1].text.encode('utf-8').isspace () is False: 108 | # print "First item of matching", matching[0].text.encode('utf-8').strip(), "second item of matching", matching[1].text.encode('utf-8').strip() 109 | # Keep track of multiple alignments of a node. 110 | # matched has matching of only two trees 111 | self.align_and_link(matched) 112 | # After matching mark the nodes matched 113 | track_matches[childR] = 1 114 | track_matches[childF] = 1 115 | 116 | def print_dict(self, arg): 117 | for node in arg: 118 | print node.tag 119 | print " " 120 | print "\n\n" 121 | 122 | 123 | def align_and_link(self, matching): 124 | 125 | self.print_dict(self.full_matching) 126 | print self.full_matching 127 | 128 | for matched in matching: 129 | if self.full_matching.has_key(matched[0]) is True: 130 | self.full_matching[matched[0]].append(matched[1]) 131 | else: 132 | self.full_matching[matched[0]] = [] 133 | self.full_matching[matched[0]].append(matched[1]) 134 | 135 | self.print_dict(self.full_matching) 136 | 137 | 138 | #TODO url don't work for some special character . eg., &, you need to input as \& 139 | # command line argument sequence url, source (only specify in case of web otherwise it's fine) 140 | 141 | if __name__ == "__main__": 142 | 143 | net = NET('file:////home/mitesh/Documents/web data extraction/pynet/tests/resources/test.html', source="local") 144 | 145 | """ 146 | print sys.argv 147 | url, source = sys.argv[1:] 148 | print "url:",url, " source:",source 149 | net = NET(url, source) 150 | """ 151 | 152 | net.net() 153 | print net.full_matching 154 | 155 | -------------------------------------------------------------------------------- /pynet/net.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/pynet/net.pyc -------------------------------------------------------------------------------- /pynet/output: -------------------------------------------------------------------------------- 1 | ======================Dom Tree======================== 2 | 3 | 4 | 5 | 6 | ['net.py'] 7 | {} 8 | =======================After align------------------ 9 | {: [], : [], : [], : [], : []} 10 | 50 11 | 410 12 | Smith 13 | Clinton 14 | Jill 15 | Hill 16 | ------------TABLE----------------- 17 | [['50', '410'], ['Smith', 'Clinton'], ['Jill', 'Hill']] 18 | 2 3 19 | {} 20 | =======================After align------------------ 21 | {: [], : [], : [], : [], : [], : [], : []} 22 | Smith 23 | Jackson 24 | Optinal1 25 | Optinal5 26 | Jill 27 | Janet 28 | 50 29 | 500 30 | ------------TABLE----------------- 31 | [['Smith', 'Jackson'], ['Optinal1', 'Optinal5'], ['Jill', 'Janet'], ['50', '500']] 32 | 2 4 33 | ===== Tree Travesal Time ===== 34 | 0.001853 35 | 36 | 37 | 38 | {} 39 | -------------------------------------------------------------------------------- /pynet/output.csv: -------------------------------------------------------------------------------- 1 | 50,Jill,Noise1,Smith 2 | 410,Hill,Noise2,Clinton 3 | Test record number 2,Test record number 1 4 | Noise2,Noise1 5 | -------------------------------------------------------------------------------- /pynet/output.out: -------------------------------------------------------------------------------- 1 | ======================Dom Tree======================== 2 | [, ] 3 | ====================================================== 4 | 5 | 6 | 7 | ['net.py'] 8 | 9 | 10 | 11 | {} 12 | tr 13 | 14 | td 15 | 16 | table 17 | 18 | td 19 | 20 | td 21 | 22 | 23 | 24 | 25 | Smith 26 | Clinton 27 | 50 28 | 410 29 | Jill 30 | Hill 31 | ------------TABLE----------------- 32 | [['Smith', 'Clinton'], ['50', '410'], ['Jill', 'Hill']] 33 | 2 3 34 | 35 | 36 | 37 | {} 38 | div 39 | 40 | table 41 | 42 | td 43 | 44 | td 45 | 46 | tr 47 | 48 | td 49 | 50 | td 51 | 52 | 53 | 54 | 55 | Smith 56 | Jackson 57 | Optinal1 58 | Optinal5 59 | Jill 60 | Janet 61 | 50 62 | 500 63 | ------------TABLE----------------- 64 | [['Smith', 'Jackson'], ['Optinal1', 'Optinal5'], ['Jill', 'Janet'], ['50', '500']] 65 | 2 4 66 | ==================== Tree Travesal Time ============== 67 | 0.001972 68 | ====================================================== 69 | 70 | 71 | 72 | {} 73 | -------------------------------------------------------------------------------- /pynet/tree.py: -------------------------------------------------------------------------------- 1 | from lxml import etree 2 | from StringIO import StringIO 3 | import numpy as np 4 | import json 5 | 6 | 7 | class tree(object): 8 | 9 | def __init__(self): 10 | pass 11 | 12 | def get_depth(self, root): 13 | if len(root) == 0: 14 | return 0 15 | return max(self.get_depth(child) + 1 for child in root.getchildren()) 16 | 17 | def get_size(self, root): 18 | if len(root) == 0: 19 | return 0 20 | return sum(1 + self.get_size(child) for child in root.getchildren()) 21 | 22 | def tree_match(self, t1, t2, matched): 23 | # Computes the Simple Tree Matching distance between trees and 24 | # stores the matching(in pairs of form (element1, element2) in "matched" list passed as argument 25 | if t1 is None or t2 is None: 26 | return 0 27 | 28 | if t1.tag != t2.tag: 29 | return 0 30 | 31 | flag = 0 32 | # Recording alignment as nodes are matched 33 | # Not an elegant way, bad time complexity. Each call of tree_match calls this. Think 34 | # of some workaround for this. 35 | for matching in matched: 36 | if t1 in matching or t2 in matching: 37 | flag = 1 38 | if flag == 0: 39 | # To remove unncecesary script tags matching 40 | if t1.tag != "script" and t2.tag != "script": 41 | matched.append([t1, t2]) 42 | child1 = t1.getchildren() 43 | child2 = t2.getchildren() 44 | m = len(t1) 45 | n = len(t2) 46 | M = np.zeros((m+1, n+1), np.int) 47 | for i in range(1, m+1): 48 | for j in range(1, n+1): 49 | M[i][j] = max(M[i][j-1], M[i-1][j], M[i-1][j-1] + 50 | self.tree_match(child1[i-1], child2[j-1], matched)) 51 | return (M[m][n]+1) 52 | 53 | def tree_alignment(self): 54 | pass 55 | 56 | -------------------------------------------------------------------------------- /pynet/tree.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/pynet/tree.pyc -------------------------------------------------------------------------------- /pynet/tree.py~: -------------------------------------------------------------------------------- 1 | from lxml import etree 2 | from StringIO import StringIO 3 | import numpy as np 4 | import json 5 | 6 | 7 | class tree(object): 8 | 9 | def __init__(self): 10 | pass 11 | 12 | def get_depth(self, root): 13 | if len(root) == 0: 14 | return 0 15 | return max(self.get_depth(child) + 1 for child in root.getchildren()) 16 | 17 | def get_size(self, root): 18 | if len(root) == 0: 19 | return 0 20 | return sum(1 + self.get_size(child) for child in root.getchildren()) 21 | 22 | def tree_match(self, t1, t2, matched): 23 | # Computes the Simple Tree Matching distance between trees and 24 | # stores the matching(in pairs of form (element1, element2) in "matched" list passed as argument 25 | if t1 is None or t2 is None: 26 | return 0 27 | 28 | if t1.tag != t2.tag: 29 | return 0 30 | 31 | flag = 0 32 | # Recording alignment as nodes are matched 33 | # Not an elegant way, bad time complexity. Each call of tree_match calls this. Think 34 | # of some workaround for this. 35 | for matching in matched: 36 | if t1 in matching or t2 in matching: 37 | flag = 1 38 | if flag == 0: 39 | # To remove unncecesary script tags matching 40 | if t1.tag != "script" and t2.tag != "script": 41 | matched.append([t1, t2]) 42 | child1 = t1.getchildren() 43 | child2 = t2.getchildren() 44 | m = len(t1) 45 | n = len(t2) 46 | M = np.zeros((m+1, n+1), np.int) 47 | for i in range(1, m+1): 48 | for j in range(1, n+1): 49 | M[i][j] = max(M[i][j-1], M[i-1][j], M[i-1][j-1] + 50 | self.tree_match(child1[i-1], child2[j-1], matched)) 51 | return (M[m][n]+1) 52 | 53 | def tree_alignment(self): 54 | pass 55 | 56 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | 2 | try: 3 | from setuptools import setup 4 | except ImportError: 5 | from distutils.core import setup 6 | 7 | config = { 8 | 'description': 'My Project', 9 | 'author': 'My Name', 10 | 'url': 'URL to get it at.', 11 | 'download_url': 'Where to download it.', 12 | 'author_email': 'My email.', 13 | 'version': '0.1', 14 | 'install_requires': ['nose'], 15 | 'packages': ['pynet'], 16 | 'scripts': [], 17 | 'name': 'projectname' 18 | } 19 | 20 | setup(**config) 21 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shashankg7/pynet/e839b8d75617d57c9a9dbf4ce481c25fa179a3cf/tests/__init__.py -------------------------------------------------------------------------------- /tests/pynet_tests.py: -------------------------------------------------------------------------------- 1 | 2 | from nose.tools import * 3 | import pynet 4 | 5 | def setup(): 6 | print "SETUP!" 7 | 8 | def teardown(): 9 | print "TEAR DOWN!" 10 | 11 | def test_basic(): 12 | print "I RAN!" 13 | -------------------------------------------------------------------------------- /tests/resources/1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Lees recensies over Rhodos in Enschede op iens.nl 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 30 | 31 | 32 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 64 | 65 | 66 | 87 | 88 | 89 | 90 | 106 | 107 | 108 |
109 |
110 |
111 | 112 |
118 | 119 |
120 | 121 |
122 |
123 |

Zoek restaurant op naam of stad

124 |
125 | 126 | 127 |
128 |
129 |
130 | 131 |
132 |
133 | Kies de stad 134 |
135 |
136 | 142 | 148 | 154 | 160 | 166 | 172 |
173 |
174 | 175 | 176 |
177 |
178 |
179 | 180 | 181 | 182 | 187 | 188 |
189 | 194 | 199 |
200 | 201 | 202 |
203 |
204 |
205 |

206 | 207 | Rhodos 208 |

209 |
210 |
211 | Schrijf een recensie 212 |
213 |
214 |
215 |
216 |
217 | 218 | 219 |
220 |
221 |
222 |
223 | 224 |
7.9
10 225 |
226 |
Eten
227 |
228 |
229 |
7.4
Service
230 |
231 |
232 |
7.2
Decor
233 |
234 |
Op basis van 2 recensies met cijfer
235 |
2
236 |
237 | 238 | 239 |
240 |

241 | 242 | Rhodos 243 | 244 |

245 |
246 |
247 | 248 | 249 | 253 | 254 | 255 |
256 | Toon telefoonnummer 257 | 053 431 40 50
258 |
259 | 260 | 261 | 262 | 263 |
264 |
265 | 266 | 267 | Maak favoriet 268 | 269 | 270 | Schrijf een recensie 271 |
272 |
273 |
274 |
275 |
276 | 277 | 278 | 287 |
288 | 289 | 290 | 291 | 292 |
293 |
294 | 295 |
296 | 297 |
298 | 299 | 305 |
311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 |
319 |

Is dit uw restaurant?

320 | Controleer nu uw gegevens 321 |
322 | 323 | 324 |
Delen
325 |
326 |
327 | 328 |
329 |
330 |
331 | 332 |
333 |
334 | 335 | 336 |
337 |
338 | 339 | 340 | 344 |
Kaart & route
345 |
346 |
347 |

348 | Grote kaart weergeven
349 | Route 9292 350 |

351 |
352 | 353 |
354 | 355 |
356 | 357 |

Belangrijkste kenmerken

358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 375 | 376 |
KeukenGrieks
Meld dit restaurant als niet meer open »
Bijzondere kenmerken 373 | 374 |
377 | Alle kenmerken weergeven » 378 | 379 |
380 | 381 |

Recensies

382 | 383 |

Toon verdeling

384 |
385 |

Verberg verdeling

386 |

Verdeling van 2 recensies met cijfer

387 |

Geschreven in de afgelopen twee jaar.

388 | 389 | 390 | 391 | 392 | 393 | 394 | 399 | 400 | 401 | 402 | 403 | 408 | 409 | 410 | 411 | 412 | 417 | 418 | 419 | 420 | 421 | 426 | 427 | 428 | 429 | 430 | 435 | 436 | 437 | 438 |
Eten
395 |
396 |
397 |
398 |
0 (0%)
404 |
405 |
406 |
407 |
2 (100%)
413 |
414 |
415 |
416 |
0 (0%)
422 |
423 |
424 |
425 |
0 (0%)
431 |
432 |
433 |
434 |
0 (0%)
439 | 440 | 441 | 442 | 443 | 444 | 449 | 450 | 451 | 452 | 453 | 458 | 459 | 460 | 461 | 462 | 467 | 468 | 469 | 470 | 471 | 476 | 477 | 478 | 479 | 480 | 485 | 486 | 487 | 488 |
Service
445 |
446 |
447 |
448 |
0 (0%)
454 |
455 |
456 |
457 |
1 (50%)
463 |
464 |
465 |
466 |
0 (0%)
472 |
473 |
474 |
475 |
1 (50%)
481 |
482 |
483 |
484 |
0 (0%)
489 | 490 | 491 | 492 | 493 | 494 | 499 | 500 | 501 | 502 | 503 | 508 | 509 | 510 | 511 | 512 | 517 | 518 | 519 | 520 | 521 | 526 | 527 | 528 | 529 | 530 | 535 | 536 | 537 | 538 |
Decor
495 |
496 |
497 |
498 |
0 (0%)
504 |
505 |
506 |
507 |
0 (0%)
513 |
514 |
515 |
516 |
1 (50%)
522 |
523 |
524 |
525 |
1 (50%)
531 |
532 |
533 |
534 |
0 (0%)
539 |
540 |

De laatste recensies

541 |
542 | 543 |
544 |
545 |
546 | 547 | 548 | 11 augustus 2013 549 |
550 |
8
551 |
Eten
552 |
8
553 |
Service
554 |
6
555 |
Decor
556 |
557 |

558 | Weekendje weg en via de diner jaarkaart hier met korting gegeten. We hadden de Thomas schotel voor z'n 2-en. Erg lekker met goed gekruide biefstuk, een spies, kipfilet en de onvermijdelijke gyros. Zeer smaakvol. Als afsluiting een kopje koffie van het huis. Een aanrader.

559 | Gegeten op: 9 augustus 2013. 560 |
561 | 562 | 563 | 564 |
565 | 566 |
567 |
568 | 569 | 570 |
571 |
Nuttig
572 |
573 | 574 |
575 |
576 | 577 |
578 |
579 |
580 |
581 | 582 |
583 |
584 | 585 | Proever67631 586 | 587 |
588 | 589 | Proever6763... 590 | 591 | 592 |
593 | 594 |
597 |
598 | Proever 599 |
600 |
601 | 602 |
603 | 604 |
605 |
606 | 607 |
608 |
609 | 610 |
611 |
612 |
613 |
614 | 615 | 616 | 27 juli 2012 617 |
618 |
8
619 |
Eten
620 |
6
621 |
Service
622 |
7
623 |
Decor
624 |
625 |

626 | met een grote groep hier gegeten, op het eten was niets aan te merken, verschillende voorgerechten en ook het hoofdgerecht was door de kok zelf samengesteld op ons verzoek. het duurde allemaal heel erg lang voordat we konden eten. Het was er druk, maar zelfs op het water moesten we lang wachten, dat viel ons erg tegen. prijs kwaliteit was goed.

627 | Gegeten op: 28 juni 2012. 628 |
629 | 630 | 631 | 632 |
633 | 634 |
635 |
636 | 637 | 638 |
639 |
Nuttig
640 |
641 | 642 |
643 |
644 | 645 |
646 |
647 |
648 |
649 | 650 |
651 |
652 | 653 | rianne 654 | 655 |
656 | 657 | rianne 658 | 659 | 660 |
661 | 662 |
665 |
666 | Expertproever 667 |
668 |
669 | 670 |
671 | 672 |
673 |
674 | 675 |
676 |
677 | 678 |

De onderstaande recensies hebben een afwijkend uiterlijk, omdat ze zijn ingediend in het oude systeem. Bekijk hier wat er is veranderd.

679 |
680 | 681 |
682 |
683 |
684 | 685 | 686 | 687 | 30 december 2011 688 |
689 |
Uitstekend
690 |

691 | Al sinds de opening, zo'n 25 jaar geleden, komen wij, met heel veel plezier, bij Rhodos. Buiten het feit dat Aslan en Sharly geweldige gastheren zijn, hebben zij ook een geweldige kok. Het eten is dan ook niet te versmaden. Een van onze favorieten: garnalen in roomsaus (voorgerecht) en de overheelijk gegrilde zalm als hoofd gerecht. (eat) De sfeer is er altijd ongedwongen en gezellig. Je voelt je er direct thuis. Als wij buiten de deur ergens willen eten komen wij heel regelmatig uit bij Rhodos. Je kunt de avond heerlijk genieten en je laten verwennen onder het genot van een goed glas wij (wine). Proost!!

692 |
693 | 694 | 695 | 696 |
697 |
698 |
699 | 700 | 701 |
702 |
Nuttig
703 |
704 | 705 |
706 |
707 | 708 |
709 |
710 |
711 |
712 | 713 |
714 |
715 | 716 | 0096352 717 | 718 |
719 | 720 | 0096352 721 | 722 | 723 |
724 | 725 |
728 |
729 | Proever in spe 730 |
731 |
732 | 733 |
734 | 735 |
736 |
737 | 738 |
739 |
740 | 741 |
742 |
743 |
744 |
745 | 746 | 747 | 748 | 28 december 2010 749 |
750 |
Goed
751 |

752 | Wederom lekker gegeten bij Aslan en Charly.
753 | Geen droge spiezen of koteletjes maar uitstekend gegrild. Het persoonlijke van beide heren is zeer aangenaam. Aanrader!

754 |
755 | 756 | 757 | 758 |
759 |
760 |
761 | 762 | 763 |
764 |
Nuttig
765 |
766 | 767 |
768 |
769 | 770 |
771 |
772 |
773 |
774 | 775 |
776 |
777 | 778 | herja 779 | 780 |
781 | 782 | herja 783 | 784 | 785 |
786 | 787 |
790 |
791 | Proever in spe 792 |
793 |
794 | 795 |
796 | 797 |
798 |
799 | 800 |
801 |
802 | 803 |
804 |
805 |
806 |
807 | 808 | 809 | 810 | 28 augustus 2010 811 |
812 |
Redelijk
813 |

814 | Best wel een prima Griek. Natuurlijk veel te grote porties vlees, maar niet het moddervette spul dat veel andere Grieken je voorzetten. Kwaliteit van de groenten (salades, tomaten) niet slecht, maar ook niet memorabel. Bediening was rommelig.

815 |
816 | 817 | 818 | 819 |
820 |
821 |
822 | 823 | 824 |
825 |
Nuttig
826 |
827 | 828 |
829 |
830 | 831 |
832 |
833 |
834 |
835 | 836 |
837 |
838 | 839 | giuseppes 840 | 841 |
842 | 843 | giuseppes 844 | 845 | 846 |
847 | 848 |
851 |
852 | Proever in spe 853 |
854 |
855 | 856 |
857 | 858 |
859 |
860 | 861 |
862 |
863 | 864 |

Alle 11 recensies weergeven »

865 |
866 |

Schrijf zelf een recensie over Rhodos

867 |

Schrijf hieronder je recensie over Rhodos. De tekst is direct zichtbaar op iens.nl, de cijfers tellen pas mee nadat de redactie je recensie heeft goedgekeurd.

868 |
874 | 875 |
876 |
877 |
Eten
878 |
879 | 880 | 881 |
882 | 883 | 884 |
885 |
886 |
887 |
Service
888 |
889 | 890 |
891 | 892 | 893 |
894 |
895 |
896 |
Decor
897 |
898 | 899 |
900 | 901 | 902 |
903 |
904 | 905 |
906 |
907 | Recensie 908 | 909 |
910 |
911 | 912 | 913 |
914 | Lees onze tips en richtlijnen voor het schrijven van een recensie 915 |
916 |
917 |
918 | 919 | Wanneer heb je hier gegeten? 920 |
921 |
922 | 923 | 924 |
925 |
926 | 927 | 928 |
929 | 930 | 931 | Ik heb hier gegeten tijdens de IENS DinerDagen 932 |
933 |
934 |
935 |
936 | 937 | Ik verklaar hierbij dat ik alle informatie naar waarheid heb ingevuld.
938 | 939 |
940 | 941 |
942 |
943 | 944 |
945 | 946 |
947 | 948 |
949 |
950 |
951 |
952 |
953 |
954 | 955 | 956 | 959 | 960 | 961 |
962 |

963 | Tot 60% korting bij toprestaurants met IENS DinerDeals! Schrijf je in 964 |

965 |
966 | 1002 | 1003 | 1010 | 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | 1026 | 1027 | 1028 | 1029 | 1030 | 1047 | 1048 | 1049 |
1050 | 1062 | 1063 | 1064 | 1067 | 1068 | 1069 | 1080 | 1081 | 1091 | 1092 | 1093 | -------------------------------------------------------------------------------- /tests/resources/3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Pasta e Fagioli in Nijmegen lees recensies en meer op iens.nl 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 30 | 31 | 32 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 64 | 65 | 66 | 87 | 88 | 89 | 90 | 106 | 107 | 108 |
109 |
110 |
111 | 112 |
118 | 119 |
120 | 121 |
122 |
123 |

Zoek restaurant op naam of stad

124 |
125 | 126 | 127 |
128 |
129 |
130 | 131 |
132 |
133 | Kies de stad 134 |
135 |
136 | 142 | 148 | 154 | 160 | 166 | 172 |
173 |
174 | 175 | 176 |
177 |
178 |
179 | 180 | 181 | 182 | 187 | 188 |
189 | 194 | 199 |
200 | 201 | 202 |
203 |
204 |
205 |

206 | 207 | Pasta e Fagioli 208 |

209 |
210 |
211 | Schrijf een recensie 212 |
213 |
214 |
215 |
216 |
217 | 218 | 219 |
220 |
221 |
222 |
223 | 224 |
7.9
10 225 |
226 |
Eten
227 |
228 |
229 |
7.7
Service
230 |
231 |
232 |
8.1
Decor
233 |
234 |
Op basis van 7 recensies met cijfer
235 |
7
236 |
237 | 238 | 239 |
240 |

241 | 242 | Pasta e Fagioli 243 | 244 |

245 |
246 |
247 | 248 | 249 |
250 | Van Welderenstraat 105
251 | Nijmegen 252 |
253 | 254 | 255 |
256 | Toon telefoonnummer 257 | 024 323 42 83
258 |
259 | 260 | 261 | 262 | 263 |
264 |
265 | 266 | 267 | Maak favoriet 268 | 269 | 270 | Schrijf een recensie 271 |
272 |
273 |
274 |
275 |
276 | 277 | 278 | 287 |
288 | 289 | 290 | 291 | 292 |
293 |
294 | 295 |
296 | 297 |
298 | 299 | 305 |
311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 |
Delen
320 |
321 |
322 | 323 |
324 |
325 |
326 | 327 |
328 |
329 | 330 | 331 |
332 |
333 | 334 | 335 | 339 |
Kaart & route
340 |
341 |
342 |

343 | Grote kaart weergeven
344 | Route 9292 345 |

346 |
347 | 348 |
349 | 350 |
351 | 352 |

Belangrijkste kenmerken

353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 370 | 371 |
ActiviteitenRestaurant, Traiteur/delicatessen
KeukenItaliaans
Menuprijs€34.50
Gem. prijs hoofdgerecht€22.50
Openingstijden
  • Ma
  • Di
  • Wo
  • Do
  • Vr
  • Za
  • Zo
Meld dit restaurant als niet meer open »
Bijzondere kenmerken 368 | 369 |
372 | Alle kenmerken weergeven » 373 | 374 |
375 | 376 |

Recensies

377 | 378 |

Toon verdeling

379 |
380 |

Verberg verdeling

381 |

Verdeling van 7 recensies met cijfer

382 |

Geschreven in de afgelopen twee jaar.

383 | 384 | 385 | 386 | 387 | 388 | 389 | 394 | 395 | 396 | 397 | 398 | 403 | 404 | 405 | 406 | 407 | 412 | 413 | 414 | 415 | 416 | 421 | 422 | 423 | 424 | 425 | 430 | 431 | 432 | 433 |
Eten
390 |
391 |
392 |
393 |
3 (43%)
399 |
400 |
401 |
402 |
2 (29%)
408 |
409 |
410 |
411 |
2 (29%)
417 |
418 |
419 |
420 |
0 (0%)
426 |
427 |
428 |
429 |
0 (0%)
434 | 435 | 436 | 437 | 438 | 439 | 444 | 445 | 446 | 447 | 448 | 453 | 454 | 455 | 456 | 457 | 462 | 463 | 464 | 465 | 466 | 471 | 472 | 473 | 474 | 475 | 480 | 481 | 482 | 483 |
Service
440 |
441 |
442 |
443 |
3 (43%)
449 |
450 |
451 |
452 |
2 (29%)
458 |
459 |
460 |
461 |
0 (0%)
467 |
468 |
469 |
470 |
2 (29%)
476 |
477 |
478 |
479 |
0 (0%)
484 | 485 | 486 | 487 | 488 | 489 | 494 | 495 | 496 | 497 | 498 | 503 | 504 | 505 | 506 | 507 | 512 | 513 | 514 | 515 | 516 | 521 | 522 | 523 | 524 | 525 | 530 | 531 | 532 | 533 |
Decor
490 |
491 |
492 |
493 |
4 (57%)
499 |
500 |
501 |
502 |
1 (14%)
508 |
509 |
510 |
511 |
1 (14%)
517 |
518 |
519 |
520 |
1 (14%)
526 |
527 |
528 |
529 |
0 (0%)
534 |
535 |

De laatste recensies

536 |
537 | 538 |
539 |
540 |
541 | 542 | 543 | 22 augustus 2013 544 |
545 |
7
546 |
Eten
547 |
6
548 |
Service
549 |
9
550 |
Decor
551 |
552 |

553 | Afgelopen zaterdag avond hebben we hier met z'n zessen heerlijk kunnen dineren. De entourage was erg prettig en de bediening verliep soepel, op een paar vreemde uitschieters na (zie hieronder). Het voorgerecht op basis van aubergine, tomaat en mozarella was lekker. Ook het hoofdgerecht - de kalfsoester met serano ham was goed maar niet perse bijzonder. Er werden ook bijgerechten geserveerd op losse schaaltjes, maar heaas werd er werd niet gevraagd of alles voldoende was. De salade was bv snel op. De porties voldeden overigens prima en zeker na het nagerecht gingen wij zeer voldaan naar huis.
554 |
555 | Tot zover de sterke punten. Wat bij een restaurant van dit prijsniveau gewoon niet mag voorkomen zijn de volgende twee zaken. Ten eerste werd ons bij het opdienen van het hoofdgerecht gevraagd wie wat had besteld. Dat hoort echt niet bij een restaurant van deze klasse, en voor mij is dit een echte afkapper. Ten tweede vroegen wij om advies over de wijnkaart. Dat ging helemaal mis. Wij kregen advies van degene die de wijnkaart zou hebben samen gesteld. Echter, toen ik vroeg of de "cannonau di sardegna" bij het menu zou passen werd deze mij zonder verdere motivatie ontraden. Deze zou een zeer vreemde smaak hebben en eigenlijk nergens bij passen. Ook andere adviezen kwamen niet echt uit de verf omdat degene die ons hielp niet echt met ons erover in gesprek leek te willen. Graag wat meer enthousiasme over de eigen wijnkaart - en ook kennis. Dat kan veel beter. Ze had bijvoorbeeld kunnen vragen waarom ik nu juist die ene wijn eruit pikte - het is nl een wijn die ik heel veel drink omdat ik hem erg lekker vind en overal bij vind passen - als het tenminste een goede fles is!

556 | Gegeten op: 17 augustus 2013. 557 |
558 | 559 | 560 | 561 |
562 | 563 |
564 |
565 | 566 | 567 |
568 |
Nuttig
569 |
570 | 571 |
572 |
573 | 574 |
575 |
576 |
577 |
578 | 579 |
580 |
581 | 582 | MartenHH 583 | 584 |
585 | 586 | MartenHH 587 | 588 | 589 |
590 | 591 |
594 |
595 | Meesterproever 596 |
597 |
598 | 599 |
600 | 601 |
602 |
603 | 604 |
605 |
606 | 607 |
608 |
609 |
610 |
611 | 612 | 613 | 20 juni 2013 614 |
615 |
8
616 |
Eten
617 |
8
618 |
Service
619 |
8
620 |
Decor
621 |
622 |

623 |
624 |
625 | Een echte Italiaanse restaurant, waar heerlijke gerechten, bereid met verse ingrediënten. Ik miste traditionele een minestrone, maar tortellini met truffels gecreëerd een perfecte voorgerecht. Pasta e fagioli pasta biedt een zeer goede selectie scherpgeprijsde wijnen. Wij hebben bijna drie uur doorgebracht, genietend van leuke sfeer, Italiaanse muziek en een uitstekende service. Zal terug!
626 |

627 | Gegeten op: 1 mei 2013. 628 |
629 | 630 | 631 | 632 |
633 | 634 |
635 |
636 | 637 | 2 van de 2 proevers vinden dit nuttig. 638 | 639 |
640 |
Nuttig
641 |
642 | 643 |
644 |
645 | 646 |
647 |
648 |
649 |
650 | 651 |
652 |
653 | 654 | benny21 655 | 656 |
657 | 658 | benny21 659 | 660 | 661 |
662 | 663 |
666 |
667 | Expertproever 668 |
669 |
670 | 671 |
672 | 673 |
674 |
675 | 676 |
677 |
678 | 679 |
680 |
681 |
682 |
683 | 684 | 685 | 28 december 2012 686 |
687 |
9
688 |
Eten
689 |
10
690 |
Service
691 |
9
692 |
Decor
693 |
694 |

695 | Heerlijk gegeten. Fijne bediening, niet van die snobs die je wel eens ziet bij chique restaurants. Ook de wijnen zijn geweldig. we zijn meestal 100 euro voor 2 personen kwijt (3 gangen en lekker wijn drinken). En dat is het geld echt waard.

696 | Gegeten op: 13 december 2012. 697 |
698 | 699 | 700 | 701 |
702 | 703 |
704 |
705 | 706 | 707 |
708 |
Nuttig
709 |
710 | 711 |
712 |
713 | 714 |
715 |
716 |
717 |
718 | 719 |
720 |
721 | 722 | LiekeL 723 | 724 |
725 | 726 | LiekeL 727 | 728 | 729 |
730 | 731 |
734 |
735 | Topproever 736 |
737 |
738 | 739 |
740 | 741 |
742 |
743 | 744 |
745 |
746 | 747 |
748 |
749 |
750 |
751 | 752 | 753 | 9 december 2012 754 |
755 |
10
756 |
Eten
757 |
10
758 |
Service
759 |
10
760 |
Decor
761 |
762 |

763 | Lekker authentiek origineel Italiaans eten en drinken. Fantastische Italiaanse wijnen met bijpassende mooie gerechten. Heerlijk brood, prachtige olijfolie, op brandschoon wit damast gedekte tafels, royale tussenruimte, sfeertekening filmdiva Sophia Loren. Super deskundige advisering, uitstekende bediening en prettige ambiance. Vertrouwd en heel goed toeven. Zeer aan te bevelen.

764 | Gegeten op: 8 december 2012. 765 |
766 | 767 | 768 | 769 |
770 | 771 |
772 |
773 | 774 | 775 |
776 |
Nuttig
777 |
778 | 779 |
780 |
781 | 782 |
783 |
784 |
785 |
786 | 787 |
788 |
789 | 790 | philip. 791 | 792 |
793 | 794 | philip. 795 | 796 | 797 |
798 | 799 |
802 |
803 | Proever in spe 804 |
805 |
806 | 807 |
808 | 809 |
Deze gebruiker is ingelogd via Facebook
810 |
811 |
812 | 813 |
814 |
815 | 816 |
817 |
818 |
819 |
820 | 821 | 822 | 17 oktober 2012 823 |
824 |
8
825 |
Eten
826 |
8
827 |
Service
828 |
6
829 |
Decor
830 |
831 |

832 | Verrassend lekker gegeten, italiaans en geen pizza gelukkig.
833 | Bediening is vriendelijk. Ik vind het eten aan de prijzige kant en vind het jammer dat er geen menu is.
834 | De kaart vind ik een beetje onoverzichtelijk, misschien italiaans.
835 |
836 |

837 | Gegeten op: 13 oktober 2012. 838 |
839 | 840 | 841 | 842 |
843 | 844 |
845 |
846 | 847 | 848 |
849 |
Nuttig
850 |
851 | 852 |
853 |
854 | 855 |
856 |
857 |
858 |
859 | 860 |
861 |
862 | 863 | ursie1 864 | 865 |
866 | 867 | ursie1 868 | 869 | 870 |
871 | 872 |
875 |
876 | Proever 877 |
878 |
879 | 880 |
881 | 882 |
883 |
884 | 885 |
886 |
887 | 888 |

Alle 22 recensies weergeven »

889 |
890 |

Schrijf zelf een recensie over Pasta e Fagioli

891 |

Schrijf hieronder je recensie over Pasta e Fagioli. De tekst is direct zichtbaar op iens.nl, de cijfers tellen pas mee nadat de redactie je recensie heeft goedgekeurd.

892 |
898 | 899 |
900 |
901 |
Eten
902 |
903 | 904 | 905 |
906 | 907 | 908 |
909 |
910 |
911 |
Service
912 |
913 | 914 |
915 | 916 | 917 |
918 |
919 |
920 |
Decor
921 |
922 | 923 |
924 | 925 | 926 |
927 |
928 | 929 |
930 |
931 | Recensie 932 | 933 |
934 |
935 | 936 | 937 |
938 | Lees onze tips en richtlijnen voor het schrijven van een recensie 939 |
940 |
941 |
942 | 943 | Wanneer heb je hier gegeten? 944 |
945 |
946 | 947 | 948 |
949 |
950 | 951 | 952 |
953 | 954 | 955 | Ik heb hier gegeten tijdens de IENS DinerDagen 956 |
957 |
958 |
959 |
960 | 961 | Ik verklaar hierbij dat ik alle informatie naar waarheid heb ingevuld.
962 | 963 |
964 | 965 |
966 |
967 | 968 |
969 |
MaandagGesloten
Dinsdag t/m Zaterdag18:00 - 22:00
ZondagGesloten
970 |
971 | 972 |
973 |
974 |
975 |
976 |
977 |
978 | 979 | 980 | 983 | 984 | 985 |
986 |

987 | Tot 60% korting bij toprestaurants met IENS DinerDeals! Schrijf je in 988 |

989 |
990 | 1026 | 1027 | 1034 | 1035 | 1036 | 1037 | 1038 | 1039 | 1040 | 1041 | 1042 | 1043 | 1044 | 1045 | 1046 | 1047 | 1048 | 1049 | 1050 | 1051 | 1052 | 1053 | 1054 | 1071 | 1072 | 1073 |
1074 | 1086 | 1087 | 1088 | 1091 | 1092 | 1093 | 1104 | 1105 | 1115 | 1116 | 1117 | -------------------------------------------------------------------------------- /tests/resources/6.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Restaurant Nelsons Zeeland - Book your table online now - DiningCity 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 1044 | 1045 | 1046 | 1047 | 1048 | 1049 | 1050 |
1051 |
1052 | 1053 | 1054 | 1055 | 1056 | 1057 | 1100 | 1106 | 1107 | 1108 | 1109 | 1110 | 1111 | 1112 | 1113 | 1193 | 1194 | 1195 | 1234 | 1235 | 1236 | 1237 | 1238 | 1239 | 1240 | 1241 | 1242 | 1243 | 1251 | 1252 |
1253 | 1254 | 1255 | 1256 | 1257 | 1258 |
1259 | 1260 | 1284 | 1285 |
1286 |
1287 | 1309 |
1310 | 1311 | 1312 | 1313 | 1314 | 1315 |
1316 |

Nelsons

1317 |
Welcome home at Nelsons!
1318 |

Hogezoom 187
1319 | 4325 BH Renesse

1320 | 1321 | 1322 | 1323 | Reserve now 1324 | 1325 | 1326 |
1327 |
1328 |
1329 |
1330 | 1331 |

1332 | Average rating 1333 | 1334 |

1335 | 1336 |
1337 |
1338 |
1339 |
1340 | 1341 |
Welcome in restaurant Nelsons in Renesse.

You feel at home when you are in our restaurant.
You can come by us for a lunch, diner or a simple drink.

1342 | 1353 | Read more 1354 |
1355 | 1356 | 1381 | 1382 | 1383 |
1384 |
1385 |
1386 |
1387 |
1388 | 1397 | 1427 |
1428 | 1429 |
1430 | 1431 |
1432 |
1433 |
1434 |
1435 | 1436 | 1437 |
1438 | 1439 |
1440 | 1441 |
1442 |
1443 |
1444 |
1445 | 1447 |
1448 |
1449 |
1450 |
1451 |
1452 |
1453 | 1454 |
1455 | 1456 |
1457 | 1458 |
1459 |
1460 |
1461 |
1462 |
1463 |
1464 |
1465 |
1466 |
1467 | 1468 |
1469 | 1470 | 1471 | 1472 | 1473 | 1474 |
1475 |
1476 |
 
1477 |
1478 |
1479 |
1480 |

Information about the Restaurant

1481 |
1482 |
    1483 | 1484 | 1485 | 1486 | 1487 | 1488 | 1489 | 1490 |
  • WebsiteRestaurant's website
  • 1491 | 1492 | 1493 | 1494 | 1495 | 1496 | 1504 | 1505 | 1506 |
  • Wheelchair accessible 1507 | No 1508 |
  • 1509 | 1510 | 1511 | 1512 |
  • Parking 1513 | Paid Parking 1514 |
  • 1515 | 1516 | 1517 | 1518 | 1519 | 1520 |
  • Smoking 1521 | No seperate smoking area 1522 |
  • 1523 | 1524 | 1525 | 1526 | 1527 | 1528 | 1529 |
  • 1530 | Location 1531 | 1532 | 1533 | 1534 | 1535 | 1536 | 1537 | 1538 | 1539 | 1540 | 1541 | 1542 | 1543 | 1544 | 1545 | 1546 | 1547 | 1548 | 1549 | 1550 | 1551 | 1552 | 1553 | 1554 | 1555 | 1556 | Renesse 1557 | 1558 | 1559 | 1560 | 1561 | 1562 | 1563 |
  • 1564 | 1565 | 1566 | 1567 | 1568 | 1569 | 1570 | 1571 |
  • 1572 | Cuisine 1573 | 1574 | 1575 | 1576 | 1577 | 1578 | 1579 | 1580 | 1581 | 1582 | 1583 | 1584 | 1585 | 1586 | 1587 | 1588 | 1589 | 1590 | French 1591 | 1592 | 1593 | 1594 | 1595 | 1596 | 1597 | 1598 | 1599 | 1600 | 1601 | 1602 | 1603 | 1604 | 1605 |
  • 1606 | 1607 | 1608 | 1609 | 1610 | 1611 | 1612 | 1613 |
  • 1614 | Extras 1615 | 1616 | 1617 | 1618 | 1619 | 1620 | 1621 | 1622 | 1623 | 1624 | Terrace 1625 | 1626 | 1627 | 1628 | 1629 | 1630 | 1631 | 1632 | 1633 | 1634 | 1635 | 1636 | 1637 | 1638 | 1639 | 1640 | 1641 | 1642 | 1643 | 1644 | 1645 | 1646 | 1647 |
  • 1648 | 1649 | 1650 | 1651 | 1652 | 1653 | 1654 | 1655 |
  • Payment 1656 | 1657 | 1658 | 1659 | 1660 | 1661 | 1662 | Pin 1663 | 1664 | 1665 | 1666 | 1667 |
  • 1668 | 1669 |
1670 |
1671 |
1672 |
1673 |

Opening hours

1674 |
1675 | 1679 |
1680 |
1681 |
    1682 |
  • 1683 | Monday 1684 | 1685 | 17:00 - 21:00 1686 | 1687 |
  • 1688 |
  • Tuesday 1689 | 17:00 - 21:00 1690 | 1691 |
  • 1692 |
  • Wednesday 1693 | 17:00 - 21:00 1694 | 1695 |
  • 1696 |
  • Thursday 1697 | 17:00 - 21:00 1698 | 1699 |
  • 1700 |
  • Friday 1701 | 17:00 - 21:00 1702 | 1703 |
  • 1704 |
  • Saturday 1705 | 17:00 - 21:00 1706 | 1707 |
  • 1708 |
  • Sunday 1709 | 17:00 - 21:00 1710 | 1711 | 1712 |
  • 1713 |
1714 |
1715 | 1716 | 1748 |
1749 | 1753 | 1763 |
1764 | 1765 |
1766 | 1767 | 1768 | 1769 |
1770 |

0 Reviews

1771 |

1772 |
1773 |
1774 |
1775 |
1776 |
1777 |
    1778 | 1779 |
  • Cuisine 1780 | 1781 |
  • 1782 | 1783 |
  • Service 1784 | 1785 |
  • 1786 | 1787 |
  • Atmosphere 1788 | 1789 |
  • 1790 | 1791 |
1792 |
1793 |
1794 | Average rating 1795 |
1796 |
1797 |
1798 |
1799 |
1800 | 1801 | 1802 |
1803 | 1804 | Post your review 1805 | 1806 |
1807 |     Show all reviews 1808 |
1809 |
1810 |
1811 | 1812 |
1813 | 1814 | 1815 |
1816 |

Nelsons visitors also visited

1817 | 1818 |
    1819 | 1820 |
  • 1821 |

    1822 | Restaurant Bottles 1823 |
  • 1824 | 1825 |
  • 1826 |

    1827 | Inter Scaldes 1828 |
  • 1829 | 1830 |
  • 1831 |

    1832 | De Eetkamer 1833 |
  • 1834 | 1835 |
  • 1836 |

    1837 | Het Badpaviljoen 1838 |
  • 1839 | 1840 |
  • 1841 |

    1842 | Auberge des Moules 1843 |
  • 1844 | 1845 |
1846 |
1847 |
1848 | 1849 | 1850 | 1851 | 1852 | 1853 | 1854 | 1855 | 1856 | 2189 | 2190 | 2191 | 2192 | 2193 | -------------------------------------------------------------------------------- /tests/resources/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | test 4 | 5 | 6 |

page title

7 |
8 |

Test record number 1

9 |

Test record number 2

10 |
11 |
12 |
13 |

No of pages 1 2 3

14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
JillSmith50Optinal1
23 |

Noise1

24 | 25 | 26 | 27 | 28 | 29 |
Will40
30 |

Noise2

31 | 32 | 33 | 34 | 35 | 36 | 37 |
HillClinton410
38 |

Noise header

39 |
40 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
JanetJackson500Optinal5
49 |
50 |
51 |

Blank section

52 |
53 | 54 | 55 | -------------------------------------------------------------------------------- /tests/test_net.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | """ 3 | Test for the local and the web html page for table table generation 4 | 5 | """ 6 | class TestNET(unittest.TestCase): 7 | 8 | def test_net(self): 9 | pass 10 | 11 | if __name__ == "__main__": 12 | unittest.main() 13 | 14 | -------------------------------------------------------------------------------- /tests/test_tree.py: -------------------------------------------------------------------------------- 1 | from pynet.net import tree 2 | from lxml import etree 3 | import unittest 4 | 5 | #TODO create multiple trees and their answer. 6 | s1 = """ 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | """ 27 | 28 | s2 = """ 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | """ 41 | ans12 = ["root", "b", "d", "e", "c", "f", "g", "h"] 42 | 43 | # Space between only open-closed tag. #readability 44 | s3 = """ """ 45 | s4 = """ """ 46 | ans34 = ["c", "a"] 47 | ans13 = [] 48 | ans14 = [] 49 | 50 | class TestTreeMatch(unittest.TestCase): 51 | 52 | def test_tree_match(self): 53 | tree1 = etree.XML(s1) 54 | tree2 = etree.XML(s2) 55 | t = tree() 56 | ans = ["root", "b", "d", "e", "c", "f", "g", "h"] 57 | ret = [] 58 | self.assertEquals(7, t.tree_match(tree1, tree2, ret)) 59 | for tags, a in zip(ret, ans): 60 | self.assertEqual( tags[0].tag, a) 61 | 62 | if __name__ == "__main__": 63 | unittest.main() 64 | --------------------------------------------------------------------------------