urlopen macht Probleme

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
pytony
User
Beiträge: 25
Registriert: Mittwoch 14. Juni 2017, 11:26

Liebe Mitglieder,

ich habe einen Forum Datensatz gescraped und möchte den Seitenstatus von den Themen-URLs übeprüfen. Die URLs samt Kommentartexte etc.
sind in einer .csv Datei gespeichert. Der Code lautet wie folgt:

Code: Alles auswählen

import pandas as pd
from urllib.request import urlopen

#Pfad zur Reddit Datei
reddit_data_path = r'C:\PFADZURDATEI\2018_01_000000000000.csv'

#Erstellung einer leeren Liste (Array), in der alle Subreddits rein sollen
subreddits_data = []

#Definition des Dataframes
df = pd.read_csv(reddit_data_path, sep=',', header=0, low_memory=False,usecols=['created_utc', 'subreddit', 'author',
                                                                                'url', 'title'])[['created_utc',
                                                                                                  'subreddit', 'author',
                                                                                                  'url', 'title']]

#Zeige die ersten fünf Zeilen der CSV Datei an.
print(df.head(5))



for index, row in df.iterrows():

    url_check = urlopen(row['url'].encode('utf-8'))
    if url_check.code == 200: #200 steht für "OK" also URL ist abrufbar
        url_status = 'available'
    else:
        if (url_check.code / 100 >= 4): #alles gleich und/oder über 400 ist nicht erreichbar.
            url_status = 'unavailable'

    subreddits_data.append({'created_utc': int(row['created_utc']),
                            'subreddit': str(row['subreddit']),
                            'author': str(row['author']),
                            'title': str(row['title']),
                            'url': str(row['url']),
                            'url status': str(row['url_status'])})

data_reddit = pd.DataFrame(data = subreddits_data, columns = ['created_utc',
                                                            'subreddit',
                                                            'author',
                                                            'title',
                                                            'url',
                                                            'url status'])

data_reddit.to_csv('reddit_csv.csv')
Leider bekomme ich jedoch folgenden Fehler ausgespuckt:

Traceback (most recent call last):
File "C:/PFADZURDATEI/PycharmProjects/Reddit/reading_analyze.py", line 29, in <module>
url_check = urlopen(row['url'].encode('utf-8'))
File "C:\PFADZURDATEI\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "C:\PFADZURDATEI\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 517, in open
req.timeout = timeout
AttributeError: 'bytes' object has no attribute 'timeout'



Ich habe gegooglet und schon in dieser Zeile das "encode" hinzugefügt, damit es den ASCII Fehler behebt.:

Code: Alles auswählen

url_check = urlopen(row['url'][color=#FF0000].encode('utf-8'))[/color]

Was kann man hier machen? Die Links sind alle in der Form "https://www.URL.XY/.../..."


LG
fatony
Zuletzt geändert von pytony am Montag 30. Juli 2018, 21:10, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

`row['url'].encode('utf-8')` ist ein Bytes-Objekt, `urlopen` erwartet aber einen String. Das encode ist also falsch. Welchen ASCII-Fehler meinst Du?
pytony
User
Beiträge: 25
Registriert: Mittwoch 14. Juni 2017, 11:26

Wenn ich encode('utf-8') auslasse, dann erscheint dieser "ASCII Fehler":

UnicodeEncodeError: 'ascii' codec can't encode character '\xf6' in position 43: ordinal not in range(128)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann hat die URL illegale Zeichen. Benutzt doch das Paket «requests», das wandelt die automatisch richtig um.

Oder halt »urllib.parse.quote(url, safe=";/?:@&=+")«, ist aber nicht so schön.
pytony
User
Beiträge: 25
Registriert: Mittwoch 14. Juni 2017, 11:26

Vielen lieben Dank! Funktioniert jetzt mit der requests methode :-)
Antworten