@@ -1,30 +1,58 @@
3+# @website https://stackoverflow.com/
4+# @provide-api not clear (https://api.stackexchange.com/docs/advanced-search)
8+# @stable no (HTML can change)
9+# @parse url, title, content
1from urlparse import urljoin
11from urlparse import urljoin
2from cgi import escape
12from cgi import escape
3from urllib import urlencode
13from urllib import urlencode
4from lxml import html
14from lxml import html
16+# engine dependent config
6categories = ['it']
17categories = ['it']
8url = 'http://stackoverflow.com/'
21url = 'http://stackoverflow.com/'
9search_url = url+'search?{query}&page={pageno}'
22search_url = url+'search?{query}&page={pageno}'
10−result_xpath = './/div[@class="excerpt"]//text()'
12−paging = True
24+# specific xpath variables
25+results_xpath = '//div[contains(@class,"question-summary")]'
26+link_xpath = './/div[@class="result-link"]//a|.//div[@class="summary"]//h3//a'
27+title_xpath = './/text()'
28+content_xpath = './/div[@class="excerpt"]//text()'
15def request(query, params):
32def request(query, params):
16 params['url'] = search_url.format(query=urlencode({'q': query}),
33 params['url'] = search_url.format(query=urlencode({'q': query}),
17 pageno=params['pageno'])
34 pageno=params['pageno'])
18 return params
36 return params
39+# get response from search-request
21def response(resp):
40def response(resp):
22 results = []
41 results = []
23 dom = html.fromstring(resp.text)
43 dom = html.fromstring(resp.text)
24− for result in dom.xpath('//div[@class="question-summary search-result"]'):
46+ for result in dom.xpath(results_xpath):
25− link = result.xpath('.//div[@class="result-link"]//a')[0]
47+ link = result.xpath(link_xpath)[0]
26 href = urljoin(url, link.attrib.get('href'))
48 href = urljoin(url, link.attrib.get('href'))
27− title = escape(' '.join(link.xpath('.//text()')))
49+ title = escape(' '.join(link.xpath(title_xpath)))
28− content = escape(' '.join(result.xpath(result_xpath)))
50+ content = escape(' '.join(result.xpath(content_xpath)))
29− results.append({'url': href, 'title': title, 'content': content})
53+ results.append({'url': href,
30 return results
58 return results