2016-06-23 1 views
0

I have scraped data from a website and entered it into an array using the code below:Nettoyage gratté <a href> rails

def process_course_details(course_details) 
     details_array =[] 
     details_link = true 
     entry_link = true 

       details_info = {} 
       # Sets all data in hash 
       details_info[:url] = clean_link(course_details.search('div.coursedetails_programmeurl a')) 
       details_array.push(details_info) 
       print_details_info(details_info) 


      entry_link = course_details.search('ul.details_tabs').first 

    end 

The code above stores the element being pulled as such:

<a href="http://www.abdn.ac.uk/study/courses/undergraduate/C8R1/">View course details on provider's website</a> 

But I'd like to clean the above to the below:

http://www.abdn.ac.uk/study/courses/undergraduate/C8R1/ 

or failing that remove the apostrophe and have this:

<a href="http://www.abdn.ac.uk/study/courses/undergraduate/C8R1/">View course details on providers website</a>` 
+0

_ "J'essaie de stocker ceci dans une base de données sqlite3 mais comme le texte a une apostrophe je ne peux pas le faire" _ - Je suis sûr que SQLite peut stocker des apostrophes. Comment ressemble votre code pour stocker le texte? – Stefan

+0

une gemme que vous utilisez pour la mise au rebut? – Amit

+0

Lors du stockage d'autres données que j'ai récupérées dans la base de données, l'apostrophe a fourni des erreurs et l'a arrêtée. Une fois que j'ai nettoyé l'apostrophe et qu'il ne faisait plus partie du tableau, le code a fonctionné et la table a été créée. Db = SQLite3 :: Database.open ('ahhh.sqlite3') db.execute "INSERT INTO aahah (uname, cname, durée, qualification, url, entrée) VALUES ('# {@ uni_name}', # {@cours_name} ',' # {@ course_duration} ',' # {@ course_qual} ',' # {@ details_entry} ',' # {@ requirements} ') " si vous parlez du tableau I peut poster que – Akamaru

Répondre

0

You can extract the href with Nokogiri like this:

html = Nokogiri::HTML('<a href="http://www.abdn.ac.uk/study/courses/undergraduate/C8R1/">View course details on provider\'s website</a>') 
html.xpath("//a/@href").to_s # => "http://www.abdn.ac.uk/study/courses/undergraduate/C8R1/" 
+0

J'en extrait plusieurs (probablement quelques milliers) d'un hrefs, donc je ne suis pas tout à fait sûr de la façon dont j'implémenterais ce que vous avez suggéré sur une échelle plus grande que l'exemple que vous avez fourni. – Akamaru

+0

Eh bien, vous n'avez pas mentionné cela en question et donc personne ne sait comment vous gardez ces quelques milliers d'hrefs. Si c'est un tableau, faites juste une boucle. –

+0

Il y a beaucoup de code et la question serait trop longue si je l'incluais tout. Tout ce que je veux faire est de créer une méthode gsub qui serait capable de nettoyer le href comme il est stocké (montré dans la question) dans le tableau. Si vous avez le temps d'aider et que vous avez besoin de plus d'informations, je pourrais vous envoyer le code plus en profondeur. Je suis assez nouveau à cela. – Akamaru

0

Based on your comment:

When storing other data I've scraped into the database the apostrophe provided errors and stopped it. Once I had cleaned the apostrophe and it no longer was part of the array the code worked and the table was created.

db = SQLite3::Database.open('ahhh.sqlite3') 
db.execute "INSERT INTO aahah (uname, cname, duration, qualification, url, entry) VALUES ('#{@uni_name}', #{@course_name}', '#{@course_duration}', '#{@course_qual}', '#{@details_entry}', '#{@requirements}')" 

Vous insérez les valeurs par interpolation chaîne:

db.execute("INSERT INTO table_name (foo, bar) VALUES ('#{@foo}', '#{@bar}')") 

Apparemment, si les chaînes interpolées contiennent une apostrophe, votre chaîne SQL devient probablement invalides. Pire encore, ce code est sujet à SQL injection.

Au lieu de cela vous devez utiliser des marqueurs de paramètres et de laisser le joyau SQLite gérer l'échappement:

db.execute("INSERT INTO table_name (foo, bar) VALUES (?, ?)", [@foo, @bar]) 

Cela vous permet d'insérer en toute sécurité et d'autres caractères apostrophes spéciaux.

+0

J'ai couru votre suggestion et il a retourné cette erreur: ** bind_param': impossible de préparer Nokogiri :: XML :: Element (RuntimeError) ** – Akamaru

+0

@Akamaru ma suggestion ne contient aucun code lié à Nokogiri. – Stefan