スナックelve 本店

バツイチ40代女の日記です

3日はてブ Unicode 文字対応

ブクマされても通知が来ない日々が続いておりますが皆様いかがお過ごしですか?

snack.elve.club

このままだと

にゃーん😺

で死ぬwww

open()関数に encoding キーワード引数を与えてやると、自動変換で使用される文字コードを直接指定することができますから、これを Unicode 文字が表現できる UTF-8 等にしてやればいいわけです。

# UTF-8 を指定してファイルを出力する
f = open('all_names.csv', 'w', encoding='UTF-8')

Python エラー'cp932' codec can't encode character - スタック・オーバーフロー

というわけで対応した。

open書いたらすぐ文字コード! って思えるようにならんと駄目よねー。

コード

# -*- coding:utf-8 -*-
import urllib
import requests
import json
from lxml import etree
import datetime as dt

 
def HtmlOutput (bmInfos):
    f = open('三日はてブ.html','wt', encoding='UTF-8')
    f.write('<html><body><table>')
    f.write('<tr><th>★</th><th>URL</th><th>ユーザー</th><th>日付</th><th>コメント</th>\n')
    for b in bmInfos:
        bUrl = b['url'].replace("http://", "")
        bUrl = b['url'].replace("https://", "s/")
        bUrl = urllib.parse.quote(bUrl)
        
        f.write('<tr>')
        f.write('<td>')
        if b['star']==1:
            f.write('★')
        f.write('</td>')
        f.write('<td><a href="http://b.hatena.ne.jp/entry/' + bUrl + '" target="_blank">' + b['url'] + '</a></td><td>' + \
        b['user'] + '</td><td>' + b['date'].strftime("%Y/%m/%d") + '</td><td>' + b['comment'] + '</td>')
        f.write('</tr>\n')
    f.write('</table></body></html>')
    f.close()

def  GetImgIndex(time, eid, user):
    #URL作成
    url = "http://b.hatena.ne.jp/" + user + "/"
    url = url + time.strftime("%Y%m%d") 
    url = url + "#bookmark-" + str(eid)
    url = urllib.parse.quote(url)
    headers = {'User-Agent': 'Sample Header'}
    r = requests.get("http://s.hatena.com/entry.json?uri=" + url, headers=headers).json()
    for st in r['entries']:
        for st2 in st['stars']:
            if st2['name'] == myId:
                return 1
    return 0

myStr="elve.club"
myId = "elve"
#myStr = input("検索したいurl: ")
#myId = input("あなたのはてなID: ")
r = requests.get("http://b.hatena.ne.jp/search/text?safe=off&q=" + urllib.parse.quote(myStr) + "&users=1&mode=rss").text
r = r.encode('utf-8')
root = etree.fromstring(r)

links = root.findall(".//{http://purl.org/rss/1.0/}link")
#links = root.xpath('link', namespaces={'rss','{http://purl.org/rss/1.0/}'})
bmInfos=[]
for link in  links:
    if link != links[0]:
        headers = {'User-Agent': 'Sample Header'}
        json = requests.get("http://b.hatena.ne.jp/entry/jsonlite/?url=" + link.text, headers=headers).json()
        try:
            for bm in json['bookmarks']:
                tdatetime = dt.datetime.strptime(bm['timestamp'], '%Y/%m/%d %H:%M')
                if tdatetime > (dt.datetime.now() - dt.timedelta(days=10)):
                    bmInfo={"star":0,"url":json['url'],"user":bm['user'], "date":tdatetime,"comment":bm['comment']}
                    bmInfo["star"] = GetImgIndex(tdatetime, json['eid'], bm['user'])
                    bmInfos.append(bmInfo)
                else:
                    break                    
        except:
            print("ERR!!")
            break
HtmlOutput(bmInfos)
print("END")

出力

f:id:elve:20181208073216p:plain