2011年7月27日水曜日

BeautifulSoupのソースを読んでみた。 Read Write

上から順に舐めていくときは、findNext(), 下からならfindPrevious(),
同一レベルで順に舐めていくときは、findNextSibling(), 下からならfindPreviousSibling(),
複数形になるとそこを起点に全部

BeautifulSoupで読むのに必須なのはTagクラス。
でTagクラスには
findAll(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
基底クラスのPageElementには

findNext(self, name=None, attrs={}, text=None, **kwargs)
findAllNext(self, name=None, attrs={}, text=None, limit=None, **kwargs)
findPrevious(self, name=None, attrs={}, text=None, **kwargs)
findAllPrevious(self, name=None, attrs={}, text=None, limit=None, **kwargs)

findParent(self, name=None, attrs={}, **kwargs)
findParents(self, name=None, attrs={}, limit=None, **kwargs)

findNextSibling(self, name=None, attrs={}, text=None, **kwargs)
findNextSiblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)
findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs)
findPreviousSiblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)


で、肝になる関数が
_findOne(self, method, name, attrs, text, **kwargs)
_findAll(self, name, attrs, text, limit, generator, **kwargs)
_findOneが1個_findAllが複数探してきてくれる。_findAllのgeneratorにnextGenerator, previousGenerator, nextSiblingGenerator, previousSiblingGeneratorを渡すことで舐める方向を決めている。


<html>
    <head>
        <title>
            Page title
        </title>
    </head>
    <body>
        <p id="firstpara" align="center">
            This is paragraph one.
        </p>
        <p id="secondpara" align="blah">
            This is paragraph two.
        </p>
        <div>
            first level
            <div>
                second level
                <div>
                    third level
                </div>
            </div>
        </div>
    </body>
</html>
 example
#!/usr/bin/env python
#-*- coding:utf-8 -*-

from BeautifulSoup import BeautifulSoup

fi = open(u'test.html', u'r')
soup = BeautifulSoup(''.join(fi.read()))

print u'### document'
print u'tag name: ', soup.name

html = soup.html
print u'### top html'
print u'tag name: ', html.name

# findNext
head = html.findNext()
print u'### findNext @ html'
print u'tag name: ', head.name

title = head.findNext()
print u'### findNext @ head'
print u'tag name: ', title.name

body = title.findNext()
print u'### findNext @ title'
print u'tag name: ', body.name

# findPrevious
current = body.findPrevious()
print u'### findPrevious @ body'
print u'tag name: ', current.name

current = current.findPrevious()
print u'### findPrevious @ title'
print u'tag name: ', current.name

current = current.findPrevious()
print u'### findPrevious @ head'
print u'tag name: ', current.name

# findAllNext
current = body.findAllNext()
print u'### findAllNext @ body'
for item in current:
    print u'tag name: ', item.name

# findAllPrevious
current = body.findAllPrevious()
print u'### findAllPrevious @ body'
for item in current:
    print u'tag name: ', item.name

# findParent
current = body.findParent()
print u'### findParent @ body'
print u'tag name: ', current.name

current = title.findParent()
print u'### findParent @ title'
print u'tag name: ', current.name

# findParents
current = body.findParents()
print u'### findParents @ title'
print u'from tag name: ', body.name
for item in current:
    print u'tag name: ', item.name

bottom = body.div.div.div
print u'### findParents @ bottom of div'
print u'from tag name: ', bottom.name
current = bottom.findParents()
for item in current:
    print u'tag name: ', item.name

# findNextSibling
p = body.findNext()
print u'### findNextSibling @ body.p'
print u'from tag name: ', p.name
print p.text
current = p.findNextSibling()
print u'tag name: ', current.name
print current.text

# findNextSiblings
p = body.findNext()
print u'### findNextSiblings @ body.p'
print u'from tag name: ', p.name
print p.text
current = p.findNextSiblings()
print current
for item in current:
    print u'tag name: ', item.name

# findPreviousSibling
current = body.div
print u'### findPreviousSibling @ body.div'
print u'from tag name: ', current.name
current = current.findPreviousSibling()
print u'tag name: ', current.name
print current.text

# findPreviousSiblings
current = body.div
print u'### findPreviousSiblings @ body.div'
print u'from tag name: ', current.name
current = current.findPreviousSiblings()
print current
for item in current:
    print u'tag name: ', item.name
    print u'tag text: ', item.text

2011年7月26日火曜日

UQ Wimaxが遅い

先日、Try WiMAX レンタルで借りてみた。
朝や夜間はそこそこの速度が出るのだが昼間はダメ、比較にならないほど遅くなる。ちょっとしたファイルのダウンロードやアップロードでもウンともスンとも言わなくなるし、webサイトはリロードを頻繁に繰り返さないと取ってこない。
tracerouteで調べたら、Wimax, KDDIの内部で1,000msec以上かかっているじゃああーーりませんか。朝や夜間は100msec程度。こりゃダメだ。使いもんにならない。基地局の設置ばっかり頑張っていてもナローバンド回線では。

ここの提供パターン3,4,5あたりでMVNOでやっているところなら大丈夫なのだろうか?

結論:固定回線の代替にはなりません。

追記:2chあたりでは 上記のMVNOのほうが遅いとか言っている。これより遅いのか?

2011年7月25日月曜日

Beautiful Soup tips

ここによると全ての属性を除去するには
    for tag in soup.findAll(True):
        tag.attrs = None
bradmontgomerysさんありがとう。

2011年7月5日火曜日

coreserverでgit git-receive-pack

ここによると

hoge/.git/config

uploadpack = $HOME/usr/local/git/bin/git-upload-pack
receivepack = $HOME/usr/local/git/bin/git-receive-pack
と設定するといいらしい。

Tatsuquitoさんありがとう。

P.S.
[remote "origin"]
の最後に設定しよう。

cloneは--update-packを引数で与えて、remoteにpushするときは--receive-pack
訂正
cloneは--upload-packを引数で与えて、remoteにpushするときは--receive-pack


git clone hoge@foo.coreserver.jp:/path/to/repo --upload-pack=/virtual/hoge/path/to/git-upload-pack


git remote add origin ssh://hoge@foo.coreserver.jp/virtual/hoge/path/to/repo
git push origin master --receive-pack=/virtual/hoge/path/to/git-receive-pack


メモ:ここ

2011年7月1日金曜日

しちゃだめ

# -*- coding: utf-8 -*-

class Obj:
    string = u''
    prop = u''

def printItem(lst):
    print u'items:'
    for item in lst:
        print item.string
        print item.prop

a = Obj()
a.string = u'A'
a.prop = u'null'

b = Obj()
b.string = u'B'
b.prop = u'null'

c = Obj()
c.string = u'C'
c.prop = u'null'

lst = [a, b, c]

printItem(lst)

for item in lst:
    if item.string == u'B':
        lst.remove(item)
        continue
    else:
        item.prop = u'_add'

printItem(lst)

items:
A
null
B
null
C
null
items:
A
_add
C
null