多数のページ(たとえば1000)を解析し、リンクをtinyurlリンクに置き換える必要があります。 Pythonのページのリンクを高速に解析する
は今、私は正規表現href_link_re = re.compile(r"<a[^>]+?href\s*=\s*(\"|')(.*?)\1[^>]*>", re.S)
を使用して、これをやっているが、その十分に速くありません。
私はこれまで
- ステートマシンを考えています
は、あなたがより速くを提案できるHTMLパーサーを使用して
EDIT: あなたは、HTMLパーサが速く正規表現よりもだろうと思うだろうが、私のテストではありません:
from BeautifulSoup import BeautifulSoup, SoupStrainer
import re
import time
__author__ = 'misha'
regex = re.compile(r"<a[^>]+?href\s*=\s*(\"|')(.*?)\1[^>]*>", re.S)
def test(text, fn, desc):
start = time.time()
total = 0
links = [];
for i in range(0, 10):
links = fn(text)
total += len(links)
end = time.time()
print(desc % (end-start, total))
# print(links)
def parseRegex(text):
links = set([])
for link in regex.findall(text):
links.add(link[1])
return links
def parseSoup(text):
links = set([])
for link in BeautifulSoup(text, parseOnlyThese=SoupStrainer('a')):
if link.has_key('href'):
links.add(link['href'])
return links
if __name__ == '__main__':
f = open('/Users/misha/test')
text = ''.join(f.readlines())
f.close()
test(text, parseRegex, "regex time taken: %s found links: %s")
test(text, parseSoup, "soup time taken: %s found links: %s")
出力:
regex time taken: 0.00451803207397 found links: 2450
soup time taken: 0.791836977005 found links: 2450
(テストはAですウィキペディアのフロントページのダンプ)
私はスープをひどく使っているに違いありません。 何が間違っているのですか?
最初に ' GWW
はい、それはステートマシンのルートになります – mkoryak
なぜHTMLパーサーは正規表現より高速でしょうか?さらに、BeautifulSoupは主にPythonコードですが、reモジュールはCです。 – susmits