0

Python 3 を使用して Web サイトをスクレイピングし、値を出力しています。ここにコードがあります

import urllib.request
import re

url = "http://in.finance.yahoo.com/q?s=spy"  
hfile = urllib.request.urlopen(url)
htext = hfile.read().decode('utf-8')
regex = '<span id="yfs_l84_SPY">(.+?)</span>'
code = re.compile(regex)
price = re.findall(code,htext)
print (price)

このスニペットを実行すると、空のリストが出力されます。[]、しかし、私は値を期待しています483.33

私が間違っていることは何ですか?ヘルプ

4

2 に答える 2

2

HTML は通常の言語ではないため、HTML の解析に正規表現を使用しないことをお勧めします。はい、ここで使用できます。入り込むのは良い習慣ではありません。

あなたが抱えていると私が想像する最大の問題は、あなたがそのページ で探しているのが であるということです。ノートケース。 idspanyfs_l84_spy

とはいえ、ここにBeautifulSoupでの簡単な実装があります。

import urllib.request
from bs4 import BeautifulSoup

url = "http://in.finance.yahoo.com/q?s=spy"  
hfile = urllib.request.urlopen(url)
htext = hfile.read().decode('utf-8')
soup = BeautifulSoup(htext)
soup.find('span',id="yfs_l84_spy")
Out[18]: <span id="yfs_l84_spy">176.12</span>

そして、その数を取得するには:

found_tag = soup.find('span',id="yfs_l84_spy") #tag is a bs4 Tag object
found_tag.next #get next (i.e. only) element of the tag
Out[36]: '176.12'
于 2013-10-28T19:52:37.807 に答える
0

正規表現を正しく使用していません。これを行う方法は 2 つあります。

1.

regex = '<span id="yfs_l84_spy">(.+?)</span>'
code = re.compile(regex)
price = code.findall(htext)

2.

regex = '<span id="yfs_l84_spy">(.+?)</span>'
price = re.findall(regex, htext)

Python 正規表現ライブラリは内部でキャッシュを行うため、事前キャッシュの効果は限られていることに注意してください。

于 2013-10-28T19:37:55.870 に答える