質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5853閲覧

HTMLタグのカウント

cho

総合スコア23

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2015/10/26 06:17

複数のファイルのHTMLタグの出現頻度をカウントしようと考えています.
事前にBeautifulSoupを用いて,複数ファイル内にどのようなタグがあるか確認し,tag.txtに書き出しました.
対象ファイルに含まれるタグは網羅できていますので,
このリストと比較して存在しないタグを含むファイルはありません.
また,タグの重複は削除済みです.

tag.txt html head a herf ...

現在,tag.txtを利用してタグのカウントを行う段階です.
ただ対象のテキストを読み込み,tag,txtにある文字列と一致させると,
'a'タグに'a'も引っかかりますが,he'a'dも引っかかることになります.

そこで,対象テキストをBeautifulSoupにかけ,タグだけ抜き取り,
カウントを行おうと考えています.

python

1list=[] 2for line in open('tag.txt'): 3 line = line.strip() 4 list.append(line) #tag.txtをリストに格納 5 6 7for dir in os.listdir(path): 8 counts = [] 9 print(path + dir) #ファイルまでのパスを取得し,ファイル名をプラス 10 11 f = open(path + dir, 'r') 12 sample = f.read() 13 14 sample=BeautifulSoup(sample) 15 tag=[] 16 tag=[x.name for x in sample.find_all(True)] #対象テキストのタグをリストに格納 17

ここから,list内要素をカウントするためにhtml=0,a=0のように初期化し,
tag内の要素をカウントしていきたいのですが,うまく書くことができません.
ご教授願えませんか.

このやり方以外にスマートな方法があれば教えていただきたいです.

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

python では list は 「listを作成する」という関数として存在するので、変数名としては利用しないほうが良いです。以下では質問者さんが作成したlist という名前の変数として・・・

c=[tag.count(l) for l in list]
とすれば、c は listの中のtag名の順に個数だけ入ったリストになります。タグ名と個数の両方が欲しいなら、
c=[(l,tag.count(l)) for l in list]
とすれば、cは (タグ名,個数) というタプルのリストになります。

投稿2015/11/05 09:31

編集2015/11/05 09:32
hiro-k

総合スコア902

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

辞書オブジェクト(連想配列)を使うのはいかがでしょうか.
cはカウンタです.

python

1c = {} 2for ntag in tag: 3 c[ntag] = c.get(ntag, 0) + 1

投稿2015/10/26 11:07

KenTerada

総合スコア751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cho

2015/10/27 02:07

ご回答ありがとうございます. ご提示いただいたやり方だと,tag.txtは使用しない形になりますよね? tag.txtにあるタグの数をカウントしたいのですが,よろしければそれを踏まえて ご教授願えないでしょうか.
KenTerada

2015/10/27 02:55 編集

確かにtag.txtは使いませんが,「このリストと比較して存在しないタグを含むファイルはありません」とあったので,問題ないのかと思いました. 以下の方法では,listをリストではなく辞書にして,もしその辞書の中にタグが存在していればインクリメントしています. (どうもコメント蘭ではスペースが正しく表示されないので,アンダースコアに変えました.コピペする場合は,アンダースコアをスペースに変えてください.) ----------------------- list = {} for line in open('tag.txt'): ____line = line.strip() ____list[line] = 0 for ntag in tag: ____if ntag in list: ________list[ntag] = c.get(ntag) + 1 ----------------------- もし,tag.txtの順序を守りたければ,listは以下のように初期化してください. ----------------------- import collections list = collections.OrderedDict() -----------------------
cho

2015/10/27 04:33

丁寧な回答ありがとうございます. もう一点お伺いしたいのですが,tag,txtにあるが,対象fileには存在しないタグというものがあります. そのタグもカウントの都合上,出現回数0と取得したいのですがどうしたらよいでしょうか.
KenTerada

2015/10/27 06:47

訂正した方のコードでは,最初にtag.txt内にあるタグに対するカウンタを0で初期化しています.なので2つ目のfor文の中でインクリメントされなければ0のままです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問