Python+MySQL: Anführungszeichen im Datensatz löschen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Hallo zusammen,

Ich habe vor kurzem eine Homepage gecrawlt mit den Informationen die ich benötige. Und habe es danach geschafft in meine MySQL-Datenbank einzutragen. Aber das Problem ist nun, das einzelne Werte in Anführungszeichen dargestellt werden.


Header Price Deeplink PartnerID LocationID
'New York CityPASS' 10057 'https://www.ctrip.com/prod' 3 12


Dies ist mein Code:

Code: Alles auswählen

class Crawling(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.set_window_size(1024, 768)
        self.base_url = "https://www.ctrip.com/"
        self.accept_next_alert = True


    def test_sel(self):
        driver = self.driver
        delay = 3
        driver.get(self.base_url + "Search/new york")
        for i in range(1,2):
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(2)

        html_source = driver.page_source
        data = html_source.encode("utf-8")

        elements = driver.find_elements_by_xpath("/html/body/div[4]/div[1]/div[2]/div/div[5]/div/div[1]/div[1]/ul/li[1]/div/div[1]")
        innerElements = 15
        outerElements = len(elements)/innerElements
        #print(innerElements,  "\t", outerElements, "\t", len(elements))


        try:
            connection = mysql.connector.connect\
                (host = "localhost", user = "root", passwd ="", db = "crawling")
        except:
            print("Keine Verbindung zum Server")
            sys.exit(0)



        cursor = connection.cursor()
        #text = connection.escape_string()

        cursor.execute("TRUNCATE meta;")
        connection.commit()

        cursor.execute("ALTER TABLE meta AUTO_INCREMENT =1;")
        connection.commit()

        for j in range(1, 20):

                partner_ID = 3

                location_ID = "New York"

                price = driver.find_element_by_xpath("/html/body/div[4]/div[1]/div[2]/div/div[5]/div/div[1]/div[1]/ul/li["+str(j)+"]/div/div[1]/div[2]/span[1]").text[6:]

                headline = driver.find_element_by_xpath("/html/body/div[4]/div[1]/div[2]/div/div[5]/div/div[1]/div[1]/ul/li["+str(j)+"]/div/div[1]/div[2]/strong").text

                description = ""

                deeplink = driver.find_element_by_xpath("/html/body/div[4]/div[1]/div[2]/div/div[5]/div/div[1]/div[1]/ul/li["+str(j)+"]/div/div[1]/div[3]/div/ul/li[1]/a").get_attribute("href")





                if not all([headline, price]):                                                                          
                    print("Header not available " " | " + "Price not available " + " | " + "Deeplink: " + str(deeplink) + " | " + "PartnerID: " + str(partner_ID) + " | " + "LocationID: " + location_ID)


                else:
                    print("Header: " + headline + " | " + "Price: " + str(price) + " | " + "Deeplink: " + str(deeplink) + " | " + "PartnerID: " + str(partner_ID) + " | " + "LocationID: " + location_ID)



                    cursor.execute('''INSERT INTO meta (price_id, Header, Price, Deeplink, PartnerID, LocationID) \
                        VALUES("%s", "%s", "%s", "%s", "%s", "%s")''', ['None'] + [headline] + text + [price] + [deeplink] + [partner_ID] + [location_ID])

                    connection.commit()


        cursor.close()
        connection.close()


Könnt ihr mir sagen, was ich machen muss damit die Anführungszeichen nicht mehr dargestellt werden. Habe gelesen, das es mit der Update function funktioneren soll aber bin mir nicht sicher wie ich es anwenden soll.

Danke für eure Hilfe
BlackJack

@SeriousRuffy: Dass das ein `unitest.TestCase` ist kommt mir sehr komisch vor. Man schreibt in einem Testfall eigentlich keine Daten in eine Datenbank, man testet höchstens ob eine Funktion, Methode, oder Klasse das tut. Und einen Testfall bricht man auf keinen Fall mit `sys.exit()` ab. Damit kann man diesen Test doch gar nicht benutzen und schon gar nicht mit anderen Testfällen in einer Sammlung von Tests. Ich sehe da auch nirgends das der Testfall fehlschlagen könnte und Nebeneffekte sollte ein Testfall nach möchlichkeit auch nicht haben, da es auch Testrunner gibt, die Testfälle parallel ausführen.

Zum eigentlichen Problem: Die Anführungszeichen im SQL um die Platzhalter gehören dort nicht hin.
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Danke für dein Feedback. Hast mir sehr weiter geholfen
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:Man schreibt in einem Testfall eigentlich keine Daten in eine Datenbank, man testet höchstens ob eine Funktion, Methode, oder Klasse das tut.
Naja, wenn man einen Integrationstest schreibt, dann braucht man ja ggf. schon einen definierten Ausgangszustand, den man erst durch Einträge in die Datenbank erzeugen muss. (Bei einem Unittest hat IO imho natürlich nichts zu suchen!)

Andererseits kann man bei solchen Tests tatsächlich auch vorgesehene ``Setup`` und ``TearDown``-Mechanismen nutzen, die ich bei Unittests eher nicht benutze.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Ja okay, aber hier werden ja keine vorbereiteten oder einfach generierten Testdaten in die Datenbank geschrieben sondern die werden aus einer Webseite gescraped, über einen ferngesteuerten Firefox, in einer Testmethode, die gar nichts testet (keine `assert`-Methoden), und die in einem bestimmten Fehlerfall einen `sys.exit()` hinlegt. Das ist alles mögliche aber kein Test, also weder Integrations- noch Unittest.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:Das ist alles mögliche aber kein Test, also weder Integrations- noch Unittest.
Das stimmt allerdings :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten