teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

訂正

2020/12/02 10:25

投稿

nto
nto

スコア1438

answer CHANGED
@@ -34,8 +34,8 @@
34
34
 
35
35
  今回のソースの場合[機械種別]が記載されたtrにrowspanが設定されていた為
36
36
  rowspanを抽出し、rowspanが1を超える場合には
37
- rowspanの数だけ`.find_next_siblings()`を取得し
37
+ `.find_next_siblings()`で兄弟要素を取得し
38
- 先頭列に[機械種別]の記載がないデータの数(列×2行)のデータをスライスして抽出しています。
38
+ 先頭列に[機械種別]の記載がないデータの数(列(rowspan-1)×2行)のデータをスライスして抽出しています。
39
39
  抽出したデータの先頭に保持していたgenre変数(機械種別名)をおいてデータを整形し
40
40
  都度resultリストに追加していき、最後にdfに変換するという流れです。
41
41
 

1

追記

2020/12/02 10:25

投稿

nto
nto

スコア1438

answer CHANGED
@@ -23,4 +23,49 @@
23
23
 
24
24
  df = pd.DataFrame(result)
25
25
  df.to_csv('result.csv', encoding='cp932', header=header, index=False)
26
+ ```
27
+
28
+ ### 追記
29
+ とりあえずは以下で目的の形での取得が可能かと思います。
30
+ ちょっと複雑で説明が難しいです。
31
+ for文ではenumerarteで何番目かを判定しています。
32
+ 0番目(初回)のループである場合にはヘッダー行は無視し
33
+ それ以外の場合には要素をtd要素を抽出します。
34
+
35
+ 今回のソースの場合[機械種別]が記載されたtrにrowspanが設定されていた為
36
+ rowspanを抽出し、rowspanが1を超える場合には
37
+ rowspanの数だけ`.find_next_siblings()`を取得し
38
+ 先頭列に[機械種別]の記載がないデータの数(列×2行)文のデータをスライスして抽出しています。
39
+ 抽出したデータの先頭に保持していたgenre変数(機械種別名)をおいてデータを整形し
40
+ 都度resultリストに追加していき、最後にdfに変換するという流れです。
41
+
42
+ ```python
43
+ from bs4 import BeautifulSoup
44
+ import requests
45
+ import pandas as pd
46
+
47
+ url = 'https://ja.nc-net.or.jp/search/equipment/?cl[]=1'
48
+
49
+ res = requests.get(url)
50
+ soup = BeautifulSoup(res.content, 'html.parser')
51
+ tables = soup.find('table', id='equip1_list')
52
+
53
+ #print(tables.prettify())
54
+ header = [th.text for th in tables.find_all('th')]
55
+ result = []
56
+ for e, tr in enumerate(tables.find('tbody').find_all('tr')):
57
+ if e != 0:
58
+ genre, maker, num = [td.text for td in tr.find_all('td')]
59
+ span = int(tr.find_all('td')[0].get('rowspan'))
60
+ result.append([genre, maker, num.replace('台', '')])
61
+
62
+ if span > 1:
63
+ after = [td.text for td in tr.find_next_siblings()[0: (span-1)*2]]
64
+ for i in range(0, len(after), 2):
65
+ maker, num = after[i: i+2]
66
+ result.append([genre, maker, num.replace('台', '')])
67
+
68
+
69
+ df = pd.DataFrame(result)
70
+ df.to_csv('result.csv', encoding='cp932', header=header, index=False)
26
71
  ```