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

回答編集履歴

3

誤字修正

2019/07/20 07:35

投稿

pon_nyamo
pon_nyamo

スコア30

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  行いたい事はどちらなのでしょうか?
2
2
  ・真ん中のオレンジ部分( div id="primary-navigation" 配下)の html(ソース)を取得したい
3
- ・真ん中のオレンジ部分の「店舗一覧」をクリックした時の遷移先 URL(href)を取得したい
3
+ ・真ん中のオレンジ部分の「店舗一覧」などをクリックした時の遷移先 URL(href)を取得したい
4
4
 
5
5
  > main_body = soup.find("div", {"id": "primary-navigation"})
6
6
 
@@ -62,8 +62,8 @@
62
62
  </div><!-- #primary-header --> ★その2
63
63
  ```
64
64
 
65
- この★その1と★その2の影響で、<div id="primary-navigation"・・・の中身ごと
65
+ この★その1と★その2の影響で、**<div id="primary-navigation"・・・の中身ごと
66
- **コメントアウトとして認識されてしまい、データが取得されない**ということです。
66
+ コメントアウトとして認識されてしまい、データが取得されない**ということです。
67
67
 
68
68
  > https://ulnomad.com/2017/06/%E3%80%90html%E3%80%91%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9/#i-3
69
69
  > コメントの途中に「-(ハイフン)」が入っていると、ブラウザによっては表示に影響が出る可能性もあるので、コメントの途中でハイフンを入れないようにする。
@@ -75,7 +75,7 @@
75
75
  2.「 primary-navigation 」を囲っている上(親)の要素から取得する
76
76
   →今後のhref取得において、書き方によっては他の href も取得されてしまう
77
77
  3.python のプログラムに <!-- <div class="panel panel-primary visible-lg"> を空に置換してあげる
78
-  →応急措置です。他にもこのような箇所があるため、本来であれば1のhtml修正を行った方が良いです。
78
+  →応急措置です。他にもこのような箇所があるため、本来であれば1のhtml記述不正の修正を行った方が良いです。
79
79
 
80
80
  ちなみにコードはこれです。
81
81
 

2

回答追記

2019/07/20 07:35

投稿

pon_nyamo
pon_nyamo

スコア30

answer CHANGED
@@ -37,24 +37,50 @@
37
37
  ※ちなみに html ソース上にある <div id="main0"> は
38
38
   同じ書き方 main_body = soup.find("div", {"id": "main0"}) で取得できています。
39
39
 
40
- ですが確認したところ「 primary-navigation 」という文字が使用できないようで
40
+ ~~ですが確認したところ「 primary-navigation 」という文字が使用できないようで~~
41
- そのため「 None 」と返却されているようです。
41
+ ~~そのため「 None 」と返却されているようです。~~
42
42
 
43
- 確認方法はこちらで行いました。
43
+ ~~確認方法はこちらで行いました。~~
44
- https://docs.python.org/ja/3/library/keyword.html
44
+ ~~https://docs.python.org/ja/3/library/keyword.html~~
45
45
 
46
+ ★訂正
47
+ すみません、何か勘違いしていました。
48
+ ローカルで <div id="primary-header" data-bk-dynamic="primary-header"> 配下のhtmlだけ抜粋し
49
+ 試してみたところ「primary-header」でも取得できました。
50
+
51
+ では何が原因か探ったところ、<div id="primary-header"・・・の直前にある
52
+ コメントアウト部分が悪さをしているようです。
53
+
46
- ```python
54
+ ```html
55
+ <!-- <div class="panel panel-primary visible-lg"> --!> ★その1
56
+ <div id="primary-navigation" data-bk-dynamic="primary-navigation">
47
- import keyword
57
+ <ul>
58
+ (略)
48
- print('main0'.isidentifier())
59
+ <a href="/ワイモバイル">Y!モバイル</a>
49
- #True が返却される
60
+ </li>
61
+ </ul>
50
- print('primary-navigation'.isidentifier())
62
+ </div><!-- #primary-header --> ★その2
51
- #False が返却される
52
63
  ```
53
64
 
65
+ この★その1と★その2の影響で、<div id="primary-navigation"・・・の中身ごと
66
+ **コメントアウトとして認識されてしまい、データが取得されない**ということです。
67
+
68
+ > https://ulnomad.com/2017/06/%E3%80%90html%E3%80%91%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9/#i-3
69
+ > コメントの途中に「-(ハイフン)」が入っていると、ブラウザによっては表示に影響が出る可能性もあるので、コメントの途中でハイフンを入れないようにする。
70
+
54
71
  解決方法としては
55
- ・そのそもの id 名「 primary-navigation 」を他の文字に変更する
72
+ ~~・そのそもの id 名「 primary-navigation 」を他の文字に変更する~~
73
+ 1.html上で不正なコメントアウトを消す
74
+  →html修正が必要
56
- 「 primary-navigation 」を囲っている上(親)の要素から取得する
75
+ 2.「 primary-navigation 」を囲っている上(親)の要素から取得する
76
+  →今後のhref取得において、書き方によっては他の href も取得されてしまう
77
+ 3.python のプログラムに <!-- <div class="panel panel-primary visible-lg"> を空に置換してあげる
57
- のどちらかになると思す。
78
+  →応急措置です。他もこのよう箇所があため、本来であれば1のhtml修正を行った方が良す。
58
79
 
59
- ただ、後者だと今後 href を取得しようとしたとき
80
+ ちなみにコードはこれです。
81
+
82
+ ```python
83
+ html_doc = requests.get("http://iphone119.xyz/").text
84
+ html = html_doc.replace('<!-- <div class="panel panel-primary visible-lg"> --!>', '') #追加
60
- 書き方によっては他の href も取得されてしまうので、前者が良いかと思われます。
85
+ soup = BeautifulSoup(html, 'html.parser')
86
+ ```

1

回答追記

2019/07/20 07:27

投稿

pon_nyamo
pon_nyamo

スコア30

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  行いたい事はどちらなのでしょうか?
2
- ・真ん中のオレンジ部分(div id="primary-navigation"配下)のhtml(ソース)を取得したい
2
+ ・真ん中のオレンジ部分( div id="primary-navigation" 配下)の html(ソース)を取得したい
3
- ・真ん中のオレンジ部分の「店舗一覧」をクリックした時の遷移先URL(href)を取得したい
3
+ ・真ん中のオレンジ部分の「店舗一覧」をクリックした時の遷移先 URL(href)を取得したい
4
4
 
5
5
  > main_body = soup.find("div", {"id": "primary-navigation"})
6
6
 
@@ -14,4 +14,47 @@
14
14
  ---
15
15
 
16
16
  あと、質問する際は実際のコードを記載した方が
17
- 回答しやすいかと思います。
17
+ 回答しやすいかと思います。
18
+
19
+
20
+ ★★★★★★★★
21
+ 追記
22
+
23
+ 「 URL(href)」を取得したいとのことですが、
24
+ この書き方では前者の「真ん中のオレンジ部分(div id="primary-navigation"配下)の html(ソース)」が返却されます。
25
+
26
+ そのため「 URL(href)」を取得するのであれば
27
+ この書き方に追加で href を取得していくためのコードが必要となります。
28
+
29
+ そちらは「 python href 取得 」などでググればすぐ出てくると思います。
30
+
31
+ ------------------------
32
+
33
+ ですが、そもそも find で div id="primary-navigation" 配下が取得できないとのことなので
34
+ そこを解消します。
35
+
36
+ まず、書き方は正しいです。
37
+ ※ちなみに html ソース上にある <div id="main0"> は
38
+  同じ書き方 main_body = soup.find("div", {"id": "main0"}) で取得できています。
39
+
40
+ ですが確認したところ「 primary-navigation 」という文字が使用できないようで
41
+ そのため「 None 」と返却されているようです。
42
+
43
+ 確認方法はこちらで行いました。
44
+ https://docs.python.org/ja/3/library/keyword.html
45
+
46
+ ```python
47
+ import keyword
48
+ print('main0'.isidentifier())
49
+ #True が返却される
50
+ print('primary-navigation'.isidentifier())
51
+ #False が返却される
52
+ ```
53
+
54
+ 解決方法としては
55
+ ・そのそもの id 名「 primary-navigation 」を他の文字に変更する
56
+ ・「 primary-navigation 」を囲っている上(親)の要素から取得する
57
+ のどちらかになると思います。
58
+
59
+ ただ、後者だと今後 href を取得しようとしたとき
60
+ 書き方によっては他の href も取得されてしまうので、前者が良いかと思われます。