I'm trying to extract certain values from google patents: https://console.cloud.google.com/marketplace/product/google_patents_public_datasets/google-patents-public-data?project=pivotal-life-sciences
and the datatype of the cpc (The Cooperative Patent Classification codes) classification inside table patents-public-data.patents.publications is RECORD
If I only wanted to pull records where at least 1 of the codes is like "C01%" how would I do that?
what I'm trying right now is:
SELECT inventor, assignee, cpc, title_localized, abstract_localized, claims_localized, description_localized, filing_date
FROM patents-public-data.patents.publications
WHERE filing_date >= 20200101 and cpc.code like 'C01%'
LIMIT 2
but this returns the error:
google.api_core.exceptions.BadRequest: 400 Cannot access field code on a value with type ARRAY<STRUCT<code STRING, inventive BOOL, first BOOL, ...>> at [4:43]
I understand that this means that I'm having bad syntax on my attempt to sort the cpc statement, but I don't know what the right records are.
if it helps, here is the result from the query:
SELECT inventor, assignee, cpc, title_localized, abstract_localized, claims_localized, description_localized, filing_date
FROM patents-public-data.patents.publications
WHERE filing_date >= 20200101
LIMIT 2
output:
Row((['MEIJER, JAN', 'STAACKE, Robert', 'BURCHARD, BERND', 'MEIJER, Nils'], ['Jan Meijer', 'Staacke Robert', 'Bernd Burchard'], [{'code': 'C01B32/26', 'inventive': True, 'first': False, 'tree': []}, {'code': 'G01R33/032', 'inventive': True, 'first': True, 'tree': []}, {'code': 'G01N24/006', 'inventive': False, 'first': False, 'tree': []}, {'code': 'G01R33/26', 'inventive': False, 'first': False, 'tree': []}, {'code': 'C01B32/28', 'inventive': True, 'first': False, 'tree': []}], [{'text': 'Nv-zentrum basierender mikrowellenfreier quantensensor und dessen anwendungen und ausprägungen', 'language': 'de', 'truncated': False}, {'text': 'Nv-centre-based microwave-free quantum sensor and uses and characteristics thereof', 'language': 'en', 'truncated': False}, {'text': 'Capteur quantique sans micro-ondes fondé sur un centre nv et applications et formes dudit capteur', 'language': 'fr', 'truncated': False}], [{'text': 'Die Erfindung betrifft ein Sensorsystem auf Basis von Diamanten mit einer hohen Dichte an NV-Zentren. Die Beschreibung umfasst a) Methoden zur Herstellung der notwendigen Diamanten hoher NV-Zentrendichte, b) Merkmale solcher Diamanten, c) Sensorelemente für die Nutzung der Fluoreszenzstrahlung der solcher Diamanten, d) Sensorelemente für die Nutzung des Fotostromes solcher Diamanten, e) Systeme zur Auswertung dieser Größen, f) Systeme mit verringertem Rauschen zur Auswertung dieser Systeme, g) Gehäuse zur Verwendung solcher Systeme in automatischen Bestückungsanlagen, g) Verfahren zum Test diese Systeme und h) ein Musikinstrument als Beispiel einer letztendlichen Anwendung all dieser Vorrichtungen und Verfahren.', 'language': 'de', 'truncated': False}, {'text': 'Die Erfindung betrifft ein Sensorsystem auf Basis von Diamanten mit einer hohen Dichte an NV-Zentren. Die Beschreibung umfasst a) Methoden zur Herstellung der notwendigen Diamanten hoher NV-Zentrendichte, b) Merkmale solcher Diamanten, c) Sensorelemente für die Nutzung der Fluoreszenzstrahlung der solcher Diamanten, d) Sensorelemente für die Nutzung des Fotostromes solcher Diamanten, e) Systeme zur Auswertung dieser Größen, f) Systeme mit verringertem Rauschen zur Auswertung dieser Systeme, g) Gehäuse zur Verwendung solcher Systeme in automatischen Bestückungsanlagen, g) Verfahren zum Test diese Systeme und h) ein Musikinstrument als Beispiel einer letztendlichen Anwendung all dieser Vorrichtungen und Verfahren.', 'language': 'de', 'truncated': False}, {'text': 'The invention relates to a sensor system on the basis of diamonds with a high density of NV centres. The description comprises a) methods for producing the necessary diamonds with high NV centre density, b) features of such diamonds, c) sensor elements for the use of the fluorescence radiation of such diamonds, d) sensor elements for the use of the photocurrent of such diamonds, e) systems for evaluating these variables, f) systems with reduced noise for evaluating these systems, g) housing for the use of such systems in automatic placement systems, g) method for testing these systems, and h) a musical instrument as an example of a final use of all of these devices and methods.', 'language': 'en', 'truncated': False}, {'text': 'The invention relates to a sensor system on the basis of diamonds with a high density of NV centres. The description comprises a) methods for producing the necessary diamonds with high NV centre density, b) features of such diamonds, c) sensor elements for the use of the fluorescence radiation of such diamonds, d) sensor elements for the use of the photocurrent of such diamonds, e) systems for evaluating these variables, f) systems with reduced noise for evaluating these systems, g) housing for the use of such systems in automatic placement systems, g) method for testing these systems, and h) a musical instrument as an example of a final use of all of these devices and methods.', 'language': 'en', 'truncated': False}, {'text': 'L'invention concerne un système capteur à base de diamants dont la densité en centres NV est élevée. La description comprend a)\u202fdes méthodes de production des diamants nécessaires dont la densité des centres NV est élevée, b)\u202fles caractéristiques de tels diamants, c)\u202fdes éléments capteurs pour l'exploitation du rayonnement fluorescent de tels diamants, d)\u202fdes éléments capteurs pour l'exploitation du photocourant de tels diamants, e)\u202fdes systèmes d'évaluation de ces grandeurs, f)\u202fdes systèmes à bruit réduit pour l'évaluation de ces systèmes, g)\u202fun carter permettant d'utiliser de tels systèmes dans des installations de montage automatique, g) un procédé pour tester ces systèmes, et h) un instrument de musique comme exemple d'une application finale de tous ces dispositifs et du procédé.', 'language': 'fr', 'truncated': False}, {'text': 'L'invention concerne un système capteur à base de diamants dont la densité en centres NV est élevée. La description comprend a)\u202fdes méthodes de production des diamants nécessaires dont la densité des centres NV est élevée, b)\u202fles caractéristiques de tels diamants, c)\u202fdes éléments capteurs pour l'exploitation du rayonnement fluorescent de tels diamants, d)\u202fdes éléments capteurs pour l'exploitation du photocourant de tels diamants, e)\u202fdes systèmes d'évaluation de ces grandeurs, f)\u202fdes systèmes à bruit réduit pour l'évaluation de ces systèmes, g)\u202fun carter permettant d'utiliser de tels systèmes dans des installations de montage automatique, g) un procédé pour tester ces systèmes, et h) un instrument de musique comme exemple d'une application finale de tous ces dispositifs et du procédé.', 'language': 'fr', 'truncated': False}], [], [], 20200722), {'inventor': 0, 'assignee': 1, 'cpc': 2, 'title_localized': 3, 'abstract_localized': 4, 'claims_localized': 5, 'description_localized': 6, 'filing_date': 7})
so TL;DR how do I sort through RECORD objects in sql with the LIKE operator?
OpenAI's GPT-3 gave me the answer. Damn language models taking over StackOverflow jobs...
Looks like its:
SELECT inventor, assignee, cpc, title_localized, abstract_localized, claims_localized, description_localized, filing_date
FROM `patents-public-data.patents.publications`
WHERE filing_date >= 20200101 and
(SELECT count(*)
FROM UNNEST(cpc) c
WHERE c.code LIKE 'C01%'
) > 0
LIMIT 2
If anyone is curious I just copied that stack qustion into the playground and this was the raw output:
A:
I think you want to unnest the cpc column:
<code>SELECT inventor, assignee, cpc, title_localized, abstract_localized, claims_localized, description_localized, filing_date
FROM patents-public-data.patents.publications
WHERE filing_date >= 20200101 and
(SELECT count(*)
FROM UNNEST(cpc) c
WHERE c.code LIKE 'C01%'
) > 0
LIMIT 2;
</code>
Another option
SELECT inventor, assignee, cpc, title_localized, abstract_localized, claims_localized, description_localized, filing_date
FROM `patents-public-data.patents.publications` t
WHERE filing_date >= 20200101 and
EXISTS (SELECT 1 FROM t.cpc WHERE code LIKE 'C01%')
LIMIT 2
Please see the following minimal reproducible example.
{'URL': {68020: 'URL', 68021: 'https://www.funda.nl/koop/verkocht/vlijmen/huis-42544400-oranjelaan-55/'}, 'OfferedSince': {68020: 'OfferedSince', 68021: '20 december 2021'}, 'DateOfSale': {68020: 'DateOfSale', 68021: '22 december 2021'}, 'AskingPrice': {68020: 'AsingPrice', 68021: '269000 '}, 'Description': {68020: 'Description', 68021: 'Interessante royale woning, uitgebouwd op de begane grond, deels verbouwd en gemoderniseerd. Voorzien van een riante woonkamer met airconditioning, moderne halfopen keuken met inbouwapparatuur. De woning heeft in 2021 een nieuw dak gekregen en is voorzien van een twaalftal zonnepanelen. Op een aantal punten dient de woning nog te worden aangepast/afgerond maar dat is grotendeels al gereed. Centrale ligging nabij alle benodigde faciliteiten zoals winkels, scholen, busverbinding en goede aansluiting met de A59 waardoor steden als ’s-Hertogenbosch, Waalwijk en Tilburg goed bereikbaar zijn. Tevens liggen de Loonse- en Drunense Duinen en vestingstad Heusden op een steenworp afstand. Indeling Begane grond Entree/Hal Entree aan de voorzijde van de woning. Je komt binnen in de hal welke is voorzien van de meterkast (groepenkast 2021, glasvezel, aansluiting voor inductie koken aanwezig), de omvormer van de 12 zonnepanelen, toegang naar de multifunctionele ruimte met bijkeuken en de trapopgang naar de eerste verdieping. Multifunctionele ruimte / bijkeuken. Van oorsprong is de woning van het type drive-in, dat wil zeggen dat er oorspronkelijk een garage op de begane grond is gelegen. In de loop van de jaren is er een pui geplaatst op de plek van de garagedeur waardoor er nu een multifunctionele ruimte is ontstaan. Ideaal voor kantoor aan huis. Er is op de begane grond een extra toilet geplaatst. In de multifunctionele ruimte is de van oorsprong gelegen smeerput nog gelegen, deze is momenteel dichtgezet. Aan de achterzijde is de opstelplaats van wasmachine en droger. De multifunctionele ruimte is niet volledig afgebouwd en behoeft nog de nodige werkzaamheden om het af te ronden. Separaat is de bijkeuken gelegen met een volledig keukenblok voorzien van wasbak en gaskookplaat. In de tussenruimte is een extra kast voorzien van koel-vriescombinatie. Op deze verdieping is tevens de CV ketel geplaatst (Intergas 2012). Dit betreft een CV ketel die geleased is inclusief onderhoudscontract. Vanuit de multifunctionele ruimte bereik je de achtertuin. Eerste verdieping Via de trap bereik je de eerste verdieping en kom je op de overloop waar zich het toilet en een extra kast bevinden. Hier is te trap naar de tweede verdieping en de toegang naar de woonkamer. Woonkamer en keuken Bij binnenkomst in de woonkamer valt meteen de hoeveelheid lichtinval op. Het is een ruime en erg lichte ruimte. Voorzien van een fraaie massief houtenvloer. Aan de achterzijde is de eetruimte welke aaneengesloten is aan de ruime keuken. Hier is de airconditioning geplaatst welke de volledige verdieping in warme dagen koel houdt. De keuken is voorzien van een combi-stoomoven, koel-vriescombinatie, een 4-pits gaskookplaat en RVS afzuigkap, vaatwasser en spoelbak. Tevens is er veel kast- en opbergruimte. Het bouwjaar van de keuken dateert van 2012. In de keuken is een tegelvloer gelegen. Tweede verdieping Via een vaste trap is de tweede verdieping bereikbaar. Hier bevinden zich 3 slaapkamers en de badkamer. De eerste slaapkamer is aan de voorzijde gelegen. Deze kamer is voorzien van een airconditioning en een fraaie laminaatvloer. Slaapkamer twee ligt aan de achterzijde en is nog af te ronden, de huidige eigenaren hebben deze kamer momenteel niet in gebruik. De derde slaapkamer is ook aan de achterzijde gelegen en is, net als de overloop en eerste slaapkamer, voorzien van een fraaie laminaatvloer. Op de overloop komt daglicht via de lichtkoepel. Het plafond dient nog afgerond te worden. Het plattedak van het hoofdgebouw dateert van 2021 evenals de 12 zonnepanelen. Badkamer De badkamer is modern en deels betegeld, deels gestuukt en voorzien van een inloopdouche met glazen wanden, een wandcloset en een wastafel. Exterieur Achtertuin Vanuit de multifunctionele ruimte is de achtertuin bereikbaar. De tuin is ruim van opzet en dient nog aangelegd te worden. Oprit Aan de voorzijde van de woning is een oprit waar 2 auto’s geparkeerd kunnen worden aanwezig. Bijzonderheden * Volledig nieuw dak op het hoofdhuis (2021) voorzien van 12 zonnepanelen (2021) * Mooie riante moderne woonkeuken (2012) * Ruime en lichte woonkamer * 3 slaapkamers en moderne badkamer * Oprit voor 2 auto’s * Multifunctionele ruimte op de begane grond * Mooie ligging tegenover een speelparkje * De woning dient op een aantal punten nog afgebouwd/afgerond te worden'}, 'Postcode': {68020: 'Postcode', 68021: '5251 JK'}, 'LivingArea': {68020: 'LivingArea', 68021: '158 '}, 'PlotArea': {68020: 'PlotArea', 68021: '196 '}, 'Rooms': {68020: 'Rooms', 68021: '6'}, 'Bedrooms': {68020: 'Bedrooms', 68021: '3'}, 'Bathrooms': {68020: 'Bathrooms', 68021: '1'}, 'EnergyLabel': {68020: 'EnergyLabel', 68021: 'A'}, 'BuildYear': {68020: 'BuildYear', 68021: '1969'}, 'TypeOfHouse': {68020: 'TypeOfHouse', 68021: 'Eengezinswoning, tussenwoning (drive-in woning)'}, 'Garden': {68020: 'Garden', 68021: 'Achtertuin en voortuin'}, 'Garden-yes-no': {68020: 'Garden-yes-no', 68021: 'Yes'}}
I would like to print out all the rows that do not contain a digit in the 'AskingPrice' column.
In the above reproducible example, this would be the row 68020. What is the most efficient way to select a row that does not contain a digit?
Thanks in advance.
You could try this:
import pandas as pd
df = pd.pd.DataFrame(dict_you_provided)
print(df[df["AskingPrice"].astype(str).str.contains(pat="[a-zA-Z]", regex=True)])
# Output
URL OfferedSince DateOfSale AskingPrice ... BuildYear TypeOfHouse Garden Garden-yes-no
68020 URL OfferedSince DateOfSale AsingPrice ... BuildYear TypeOfHouse Garden Garden-yes-no
I have created a keywords.csv file in my resource folder in order to automatically fetch the data from all the products listed in there. This works perfectly. The first column of the .csv-file is named "keywords". The keywords are based on a unique number representing the product category (i.e., high pressure washer, floor cleaner, ...). I am using this number to adjust the API URL where I am fetching all the data from.
I would like to print out the product category. Because there is no product category defined in the API where I am fetching the data from, I would like to print out the second column of my .csv-file, being "keywordtype". The "keywordtype" should be printed to the products with the same "keyword".
Secondly, I've been googling around but couldn't find a solution for replacing multiple characters in one string. Is there a way of making some sort of dictionairy so that "\u00e9" gets replaced with "é", "\u00b2" with "²", etc. I tried using .replace('text','') and .split(), but for multiple characters this isn't sufficient.
What I tried
I tried calling the "keywordtype" in the def parse(self, response):, but I don't know how to make it check which keyword is being used. Therefore it keeps printing the same "keywordtype" over and over again.
...
def parse(self, response):
#Calling the "category" from the keywords.csv file -- THIS IS NOT WORKING
with open(os.path.join(os.path.dirname(__file__), "../resources/keywords.csv")) as search_keywords:
for keyword in csv.DictReader(search_keywords):
category=keyword["keywordtype"]
...
FULL CODE #1
Spider.py
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 12 22:44:35 2019
#author: bergs
"""
# -*- coding: utf-8 -*-
import scrapy
from krc.items import KrcItem
import json
import os
import csv
import time
import datetime
class KRCSpider(scrapy.Spider):
name = "krc_spider"
allowed_domains = ["kaercher.com"]
start_urls = ['https://www.kaercher.com/api/v1/products/search/shoppableproducts/partial/20035386?page=1&size=8&isocode=nl-NL']
def start_requests(self):
"""Read keywords from keywords file amd construct the search URL"""
with open(os.path.join(os.path.dirname(__file__), "../resources/keywords.csv")) as search_keywords:
for keyword in csv.DictReader(search_keywords):
search_text=keyword["keyword"]
category = keyword["keywordtype"]
url="https://www.kaercher.com/api/v1/products/search/shoppableproducts/partial/{0}?page=1&size=8&isocode=nl-NL".format(
search_text)
# The meta is used to send our search text into the parser as metadata
yield scrapy.Request(url, callback = self.parse, meta = {"search_text": search_text, "category": category})
def parse(self, response):
category = response.meta["category"]
current_page = response.meta.get("page", 1)
next_page = current_page + 1
#Printing the timestamp when fetching the data, using default timezone from the requesting machine
ts = time.time()
timestamp = datetime.datetime.fromtimestamp(ts).strftime('%d-%m-%Y %H:%M:%S')
#Defining the items
item = KrcItem()
data = json.loads(response.text)
for company in data.get('products', []):
item["productid"] = company["id"]
item["category"] = category
item["name"] = company["name"]
item["description"] = company["description"]
item["price"] = company["priceFormatted"].replace("\u20ac","").strip()
item["timestamp"] = timestamp
yield item
#Checking whether "isTruncated" is true (boolean), if so, next page will be triggered
if data["isTruncated"]:
yield scrapy.Request(
url="https://www.kaercher.com/api/v1/products/search/shoppableproducts/partial/20035386?page={page}&size=8&isocode=nl-NL".format(page=next_page),
callback=self.parse,
meta={'page': next_page},
)
FULL CODE #2
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 12 22:44:35 2019
#author: bergs
"""
# -*- coding: utf-8 -*-
import scrapy
from krc.items import KrcItem
import json
import os
import csv
import time
import datetime
class KRCSpider(scrapy.Spider):
name = "krc_spider"
allowed_domains = ["kaercher.com"]
start_urls = ['https://www.kaercher.com/api/v1/products/search/shoppableproducts/partial/20035386?page=1&size=8&isocode=nl-NL']
def start_requests(self):
"""Read keywords from keywords file amd construct the search URL"""
with open(os.path.join(os.path.dirname(__file__), "../resources/keywords.csv")) as search_keywords:
for keyword in csv.DictReader(search_keywords):
search_text = keyword["keyword"]
url="https://www.kaercher.com/api/v1/products/search/shoppableproducts/partial/{0}?page=1&size=8&isocode=nl-NL".format(
search_text)
# The meta is used to send our search text into the parser as metadata
yield scrapy.Request(url, callback = self.parse, meta = {"search_text": search_text})
def parse(self, response):
current_page = response.meta.get("page", 1)
next_page = current_page + 1
#Printing the timestamp when fetching the data, using default timezone from the requesting machine
ts = time.time()
timestamp = datetime.datetime.fromtimestamp(ts).strftime('%d-%m-%Y %H:%M:%S')
#Defining the items
item = KrcItem()
data = json.loads(response.text)
for company in data.get('products', []):
item["productid"] = company["id"]
item["category"] = company["url"].split('/')[-2].replace('-',' ')
item["name"] = company["name"]
item["description"] = company["description"]
item["price"] = company["priceFormatted"].replace("\u20ac","").strip()
item["timestamp"] = timestamp
yield item
#Checking whether "isTruncated" is true (boolean), if so, next page will be triggered
if data["isTruncated"]:
yield scrapy.Request(
url="https://www.kaercher.com/api/v1/products/search/shoppableproducts/partial/20035386?page={page}&size=8&isocode=nl-NL".format(page=next_page),
callback=self.parse,
meta={'page': next_page},
)
Keywords.csv
keyword,keywordtype
20035386,Hogedrukreiniger
20035424,Window Vacs
items.py
import scrapy
class KrcItem(scrapy.Item):
productid=scrapy.Field()
name=scrapy.Field()
description=scrapy.Field()
price=scrapy.Field()
producttype=scrapy.Field()
timestamp=scrapy.Field()
category=scrapy.Field()
pass
Results.json #1
[
{"productid": 10491477, "category": "Window Vacs", "name": "WV 6 + KV 4(wit)", "description": "De vibrerende accu-wisser KV 4 inclusief elektrische bevochtiging, vibratie, tweede wisdoek en meer accessoires maakt het vuil los - en de Window Vac WV 6 zuigt het achterblijvende water af.", "price": "169,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10491478, "category": "Window Vacs", "name": "WV 6 + KV 4", "description": "Schone vensters in een handomdraai: met de vibrerende Window Vac KV 4 inclusief elektrische watervoorziening en vibratie maakt u het vuil eerst los en daarna zuigt u met de Window Vac WV 6 het vuile water af.", "price": "159,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10491479, "category": "Window Vacs", "name": "WV 6 Plus (wit)", "description": "In een set met 2 wisdoeken voor binnen en buiten, sproeiflacon, reinigingsmiddel en vuilkrabber: de Window Vac WV 6 Premium met innovatieve zuigstrip is nog flexibeler in gebruik.", "price": "109,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10491480, "category": "Window Vacs", "name": "WV 6 Plus", "description": "Met innovatieve striptechnologie en nog flexibeler in gebruik: de Window Vac WV 6 Plus voor streepvrij schone vensters in een mum van tijd.", "price": "99,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10491481, "category": "Window Vacs", "name": "WV 2 + KV4 (wit)", "description": "Sterk duo voor streepvrij schone vensters: de vibrerende accu-wisser KV 4 inclusief elektrische bevochtiging, vibratie, tweede wisdoek en meer extra's, en de Window Vac WV 2.", "price": "139,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10491482, "category": "Window Vacs", "name": "WV 2 + KV 4", "description": "Voor moeiteloos ramen lappen: de vibrerende accu-wisser KV 4 inclusief elektrische watervoorziening en trilfunctie maakt het vuil los - en de Window Vac WV 2 zuigt het vuile water af.", "price": "129,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10475755, "category": "Window Vacs", "name": "KV 4 Premium", "description": "Inclusief tweede wisdoek: de Window Vac KV 4 met elektrische watervoorziening en ondersteunende trilfunctie maakt het vuil moeiteloos los van alle gladde oppervlakken.", "price": "89,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10475756, "category": "Window Vacs", "name": "KV 4", "description": "De vibrerende accu-wisser KV 4 maakt vuil moeiteloos los van gladde oppervlakken. Door het elektrisch aangebrachte water en de trillingen wordt handmatig schrobben overbodig.", "price": "79,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10461927, "category": "Hogedrukreiniger", "name": "K 7 Premium Full Control Plus Home", "description": "Inclusief slanghaspel en Home Kit: de K 7 Premium Full Control Plus Home. U kunt de juiste druk instellen met de +/- knoppen en de LCD-scherm op het hogedrukpistool van de hogedrukreiniger.", "price": "699,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10453128, "category": "Hogedrukreiniger", "name": "K 7 Premium Full Control Plus", "description": "Inclusief slanghaspel: de K 7 Premium Full Control Plus. U kunt de juiste druk instellen met de +/- knoppen en het LCD-scherm op het hogedrukpistool van de hogedrukreiniger.", "price": "639,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10461929, "category": "Hogedrukreiniger", "name": "K 7 Full Control Plus Home", "description": "De ideale hogedrukreiniger voor regelmatig gebruik op hardnekkig vuil. K 7 Full Control Plus Home met Home Kit en hogedrukpistool inclusief +/- knoppen voor drukregeling en LCD-scherm.", "price": "639,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10442692, "category": "Hogedrukreiniger", "name": "K 7 Full Control Plus", "description": "De K 7 Full Control Plus hogedrukreiniger van K\u00e4rcher inclusief hogedrukpistool met drukregeling en dosering van reinigingsmiddel met een druk op de knop, en een LCD-scherm waarop de druk wordt weergegeven.", "price": "579,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10462452, "category": "Hogedrukreiniger", "name": "K 5 Premium Full Control Plus Home", "description": "K 5 Premium Full Control Plus Home hogedrukreiniger met +/- knoppen voor drukregeling en LCD-scherm op het hogedrukpistool. Inclusief Home Kit, 3-in-1 Multi Jet spuitlans en slanghaspel.", "price": "499,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10442700, "category": "Hogedrukreiniger", "name": "K 5 Premium Full Control Plus", "description": "Voor regelmatig verwijderen van matige verontreiniging op auto's, stenen muren en fietsen. K 5 Premium Full Control Plus hogedrukreiniger inclusief hogedrukpistool met +/- knoppen voor drukregeling en LCD-scherm.", "price": "449,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10430946, "category": "Hogedrukreiniger", "name": "K 5 Full Control", "description": "Hogedrukreiniger met drukindicator op het hogedrukpistool - voor de juiste druk op elk oppervlak. Ideaal voor regelmatig gebruik op matige verontreiniging. Oppervlakteprestatie van 40 m\u00b2/u.", "price": "379,95", "timestamp": "18-08-2019 15:53:30"},
{"productid": 10441978, "category": "Hogedrukreiniger", "name": "K 4 Premium Full Control Home", "description": "Hogedrukreiniger met drukindicator op het hogedrukpistool \u2013 voor de juiste druk op elk oppervlak. Inclusief slanghaspel en Home Kit. Ideaal voor een gemiddelde vervuilingsgraad. Oppervlakteprestatie van 30 m\u00b2/u.", "price": "369,95", "timestamp": "18-08-2019 15:53:30"}
]
Results.json #2
[
{"productid": 10461927, "category": "hogedrukreinigers", "name": "K 7 Premium Full Control Plus Home", "description": "Inclusief slanghaspel en Home Kit: de K 7 Premium Full Control Plus Home. U kunt de juiste druk instellen met de +/- knoppen en de LCD-scherm op het hogedrukpistool van de hogedrukreiniger.", "price": "699,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10453128, "category": "hogedrukreinigers", "name": "K 7 Premium Full Control Plus", "description": "Inclusief slanghaspel: de K 7 Premium Full Control Plus. U kunt de juiste druk instellen met de +/- knoppen en het LCD-scherm op het hogedrukpistool van de hogedrukreiniger.", "price": "639,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10461929, "category": "hogedrukreinigers", "name": "K 7 Full Control Plus Home", "description": "De ideale hogedrukreiniger voor regelmatig gebruik op hardnekkig vuil. K 7 Full Control Plus Home met Home Kit en hogedrukpistool inclusief +/- knoppen voor drukregeling en LCD-scherm.", "price": "639,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10442692, "category": "hogedrukreinigers", "name": "K 7 Full Control Plus", "description": "De K 7 Full Control Plus hogedrukreiniger van K\u00e4rcher inclusief hogedrukpistool met drukregeling en dosering van reinigingsmiddel met een druk op de knop, en een LCD-scherm waarop de druk wordt weergegeven.", "price": "579,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10462452, "category": "hogedrukreinigers", "name": "K 5 Premium Full Control Plus Home", "description": "K 5 Premium Full Control Plus Home hogedrukreiniger met +/- knoppen voor drukregeling en LCD-scherm op het hogedrukpistool. Inclusief Home Kit, 3-in-1 Multi Jet spuitlans en slanghaspel.", "price": "499,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10442700, "category": "hogedrukreinigers", "name": "K 5 Premium Full Control Plus", "description": "Voor regelmatig verwijderen van matige verontreiniging op auto's, stenen muren en fietsen. K 5 Premium Full Control Plus hogedrukreiniger inclusief hogedrukpistool met +/- knoppen voor drukregeling en LCD-scherm.", "price": "449,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10430946, "category": "hogedrukreinigers", "name": "K 5 Full Control", "description": "Hogedrukreiniger met drukindicator op het hogedrukpistool - voor de juiste druk op elk oppervlak. Ideaal voor regelmatig gebruik op matige verontreiniging. Oppervlakteprestatie van 40 m\u00b2/u.", "price": "379,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10441978, "category": "hogedrukreinigers", "name": "K 4 Premium Full Control Home", "description": "Hogedrukreiniger met drukindicator op het hogedrukpistool \u2013 voor de juiste druk op elk oppervlak. Inclusief slanghaspel en Home Kit. Ideaal voor een gemiddelde vervuilingsgraad. Oppervlakteprestatie van 30 m\u00b2/u.", "price": "369,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10491477, "category": "window vacs", "name": "WV 6 + KV 4(wit)", "description": "De vibrerende accu-wisser KV 4 inclusief elektrische bevochtiging, vibratie, tweede wisdoek en meer accessoires maakt het vuil los - en de Window Vac WV 6 zuigt het achterblijvende water af.", "price": "169,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10491478, "category": "window vacs", "name": "WV 6 + KV 4", "description": "Schone vensters in een handomdraai: met de vibrerende Window Vac KV 4 inclusief elektrische watervoorziening en vibratie maakt u het vuil eerst los en daarna zuigt u met de Window Vac WV 6 het vuile water af.", "price": "159,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10491479, "category": "window vacs", "name": "WV 6 Plus (wit)", "description": "In een set met 2 wisdoeken voor binnen en buiten, sproeiflacon, reinigingsmiddel en vuilkrabber: de Window Vac WV 6 Premium met innovatieve zuigstrip is nog flexibeler in gebruik.", "price": "109,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10491480, "category": "window vacs", "name": "WV 6 Plus", "description": "Met innovatieve striptechnologie en nog flexibeler in gebruik: de Window Vac WV 6 Plus voor streepvrij schone vensters in een mum van tijd.", "price": "99,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10491481, "category": "window vacs", "name": "WV 2 + KV4 (wit)", "description": "Sterk duo voor streepvrij schone vensters: de vibrerende accu-wisser KV 4 inclusief elektrische bevochtiging, vibratie, tweede wisdoek en meer extra's, en de Window Vac WV 2.", "price": "139,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10491482, "category": "window vacs", "name": "WV 2 + KV 4", "description": "Voor moeiteloos ramen lappen: de vibrerende accu-wisser KV 4 inclusief elektrische watervoorziening en trilfunctie maakt het vuil los - en de Window Vac WV 2 zuigt het vuile water af.", "price": "129,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10475755, "category": "window vacs", "name": "KV 4 Premium", "description": "Inclusief tweede wisdoek: de Window Vac KV 4 met elektrische watervoorziening en ondersteunende trilfunctie maakt het vuil moeiteloos los van alle gladde oppervlakken.", "price": "89,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10475756, "category": "window vacs", "name": "KV 4", "description": "De vibrerende accu-wisser KV 4 maakt vuil moeiteloos los van gladde oppervlakken. Door het elektrisch aangebrachte water en de trillingen wordt handmatig schrobben overbodig.", "price": "79,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10430942, "category": "hogedrukreinigers", "name": "K 4 Premium Full Control", "description": "Hogedrukreiniger met drukindicator op het hogedrukpistool - voor de juiste druk op elk oppervlak. Inclusief slanghaspel. Ideaal voor matige verontreiniging. Oppervlakteprestatie van 30 m\u00b2/u.", "price": "319,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10441943, "category": "hogedrukreinigers", "name": "K 4 Full Control Home", "description": "Hogedrukreiniger met drukindicator op het hogedrukpistool \u2013 voor de juiste druk op elk oppervlak. Ideaal voor de incidentele reiniging van een gemiddelde vervuiling. Inclusief Home Kit. Oppervlakteprestatie van 30 m\u00b2/u.", "price": "339,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10430938, "category": "hogedrukreinigers", "name": "K 4 Full Control", "description": "Hogedrukreiniger met drukindicator op het hogedrukpistool \u2013 voor de juiste druk op elk oppervlak. Ideaal voor de incidentele reiniging van een gemiddelde vervuiling. Oppervlakteprestatie van 30 m\u00b2/u.", "price": "289,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10501457, "category": "hogedrukreinigers", "name": "K 3 Full Control Home T150", "description": "Perfect schoon rondom huis dankzij de Home Kit inclusief oppervlaktereiniger en reinigingsmiddelen. Het pistool van de K 3 Full Control Home hogedrukreiniger geeft het drukniveau aan.", "price": "209,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10501459, "category": "hogedrukreinigers", "name": "K 3 Full Control", "description": "Ideale hogedrukreiniger voor incidenteel gebruik bij lichte vervuiling. De K 3 Full Control geeft de druk aan op het pistool. Zo kunt u voor elk oppervlak de juiste druk instellen.", "price": "179,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10406424, "category": "hogedrukreinigers", "name": "K 3 Home", "description": "De K 3 Home hogedrukreiniger met Home Kit is ideaal voor incidenteel gebruik en voor de verwijdering van lichte vervuiling op bijvoorbeeld fietsen, tuinhekken en motorfietsen.", "price": "219,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10461899, "category": "hogedrukreinigers", "name": "K 2 Premium Full Control Home", "description": "De K 2 Premium Full Control Home hogedrukreiniger van K\u00e4rcher inclusief Home Kit en met gerichte drukregeling. Ideaal voor oppervlakken rondom het huis en op lichtere vervuiling.", "price": "179,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10464555, "category": "hogedrukreinigers", "name": "K 2 HOME T150", "description": "De K 2 Home op wieltjes is speciaal ontworpen voor incidenteel gebruik en lichte vervuiling. Dankzij de Home Kit houdt u met de hogedrukreiniger ook grotere oppervlakken rondom het huis eenvoudig schoon.", "price": "129,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10479573, "category": "hogedrukreinigers", "name": "K 2 Basic", "description": "De 'K2 Basic' hogedrukreiniger is ideaal voor incidenteel gebruik en verwijdering van normale vervuiling rondom de woning (bijv. fietsen, tuingereedschap, tuinmeubilair).", "price": "79,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10497774, "category": "hogedrukreinigers", "name": "K 7 Compact Home", "description": "Compact en handzaam: de hogedrukreiniger K 7 Compact met watergekoelde motor. Voor frequent gebruik en sterke vervuiling, bijvoorbeeld op straten, in zwembaden, op fietsen of grote auto's.", "price": "589,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10497770, "category": "hogedrukreinigers", "name": "K 5 Compact Home", "description": "De K5 Compact Home met watergekoelde motor neemt weinig ruimte in en kan comfortabel worden vervoerd. Hogedrukreiniger inclusief Home Kit met oppervlaktereiniger T 350 en steen- en gevelreiniger.", "price": "379,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10497773, "category": "hogedrukreinigers", "name": "K 5 Compact", "description": "Inclusief innovatieve slangopberging: de eenvoudig te vervoeren en op te bergen hogedrukreiniger K 5 Compact voor regelmatig gebruik bij middelzware vervuiling. Oppervlakteprestatie 40 m\u00b2/u.", "price": "329,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10497765, "category": "hogedrukreinigers", "name": "K 4 Compact Home", "description": "Eenvoudig te vervoeren en snel op te bergen: de K 4 Compact voor incidenteel gebruik bij middelzware vervuiling. Inclusief telescoopgreep en watergekoelde motor. Oppervlakteprestatie 30 m\u00b2/u.", "price": "289,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10497768, "category": "hogedrukreinigers", "name": "K 4 Compact", "description": "Eenvoudig te vervoeren en snel op te bergen: de K 4 Compact voor incidenteel gebruik bij middelzware vervuiling. Inclusief telescoopgreep en watergekoelde motor. Oppervlakteprestatie 30 m\u00b2/u.", "price": "249,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10472949, "category": "hogedrukreinigers", "name": "K 2 Battery Set", "description": "Kan overal worden ingezet waar er geen stopcontact beschikbaar is: De K2 hogedrukreiniger met accuaandrijving, inclusief 36 V li-ionaccu en oplader. Ideaal voor uiteenlopende toepassingen.", "price": "399,95", "timestamp": "18-08-2019 16:43:57"},
{"productid": 10472950, "category": "hogedrukreinigers", "name": "K 2 Battery", "description": "De hogedrukreiniger met accuaandrijving voor flexibel schoonmaken zonder stopcontact. Ideaal voor uiteenlopende toepassingen rondom het huis. Accu en oplader worden niet meegeleverd.", "price": "199,95", "timestamp": "18-08-2019 16:43:58"}
]
You need to yield category from CSV file to the parse using request.meta:
def start_requests(self):
"""Read keywords from keywords file amd construct the search URL"""
with open(os.path.join(os.path.dirname(__file__), "../resources/keywords.csv")) as search_keywords:
for keyword in csv.DictReader(search_keywords):
search_text=keyword["keyword"]
category = keyword["keywordtype"]
url="https://www.kaercher.com/api/v1/products/search/shoppableproducts/partial/{0}?page=1&size=8&isocode=nl-NL".format(
search_text)
# The meta is used to send our search text into the parser as metadata
yield scrapy.Request(url, callback = self.parse, meta = {"search_text": search_text, "category": category})
def parse(self, response):
category = response.meta["category"]
...
UPDATE
If you want to have your category on next page you need to use .meta again:
#Checking whether "isTruncated" is true (boolean), if so, next page will be triggered
if data["isTruncated"]:
yield scrapy.Request(
url="https://www.kaercher.com/api/v1/products/search/shoppableproducts/partial/20035386?page={page}&size=8&isocode=nl-NL".format(page=next_page),
callback=self.parse,
meta={'page': next_page, "category": category},
)
In Rails 3, is there a way to use datetime_select and display hours showing 12 hour am/pm options rather than 24-hour options?
In case anyone stumbles upon this question, the answer for rails 3.2 is:
<%= f.datetime_select :attribute_name,
ampm: true %>
Here's the method I added to my helper class:
def am_pm_hour_select(field_name)
select_tag(field_name,options_for_select([
["1 AM", "01"],["2 AM", "02"],["3 AM", "03"],["4 AM", "04"],["5 AM", "05"],["6 AM", "06"],
["7 AM", "07"],["8 AM", "08"],["9 AM", "09"],["10 AM", "10"],["11 AM", "11"],["12 PM", "12"],
["1 PM", "13"],["2 PM", "14"],["3 PM", "15"],["4 PM", "16"],["5 PM", "17"],["6 PM", "18"],
["7 PM", "19"],["8 PM", "20"],["9 PM", "21"],["10 PM", "22"],["11 PM", "23"],["12 AM", "0"]]))
end
Then I plugged that method into my view:
<%= am_pm_hour_select "eventtime[start(4i)]" %>
It seemed to do the trick, but if there's a more idiomatic way of doing this, I'd be interested to hear.
(update: fixed bugs found by thucydides)
The code below treats midnight and noon incorrectly: it calls noon '12 AM,' which is midnight; it calls midnight '12 PM,' which is noon.
Also, the code should use 0:00 as midnight, which is the international standard.
Fixed:
def am_pm_hour_select(field_name)
select_tag(field_name,options_for_select([
["1 AM", "01"],["2 AM", "02"],["3 AM", "03"],["4 AM", "04"],["5 AM", "05"],["6 AM", "06"],
["7 AM", "07"],["8 AM", "08"],["9 AM", "09"],["10 AM", "10"],["11 AM", "11"],["Noon", "12"],
["1 PM", "13"],["2 PM", "14"],["3 PM", "15"],["4 PM", "16"],["5 PM", "17"],["6 PM", "18"],
["7 PM", "19"],["8 PM", "20"],["9 PM", "21"],["10 PM", "22"],["11 PM", "23"],["Midnight", "0"]]))
end