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

回答編集履歴

1

コメントを受けて追記

2019/12/01 16:12

投稿

shirai
shirai

スコア1290

answer CHANGED
@@ -6,4 +6,74 @@
6
6
 
7
7
  これでそれぞれのarticle要素のテキストがa,b,c,...の場合、
8
8
  printの出力結果は aつなげるbつなげるcつなげる ... yつなげるz となります。
9
- つなぎに文字を使いたくない場合は'つなげる'を''に変えてください。
9
+ つなぎに文字を使いたくない場合は'つなげる'を''に変えてください。
10
+
11
+ # コメントを受けて追記
12
+
13
+ じゃあこんな感じでどうですかね。
14
+
15
+ ```python
16
+ content = []
17
+ for url in urls:
18
+ driver.get(url)
19
+ content.append('つなげる'.join([article_tag.text[2:-1] for article_tag in driver.find_elements_by_class_name('wrap_box')[2].find_elements_by_tag_name('article')]))
20
+ ```
21
+
22
+ 内包表記を使わずに分かりやすく書くなら、
23
+ ```python
24
+ content = []
25
+ for url in urls:
26
+ this_page_text = ''
27
+ driver.get(url)
28
+ for article_tag in driver.find_elements_by_class_name('wrap_box')[2].find_elements_by_tag_name('article')])):
29
+ this_page_text += article_tag.text[2:-1]
30
+ content.append(this_page_text)
31
+ ```
32
+
33
+ スライスは2:-1じゃなくて3:-2かもしれないです。
34
+ ¥nが1文字として判定されるか2文字として判定されるか
35
+ やってみないとよく分からないです。
36
+
37
+ ---
38
+
39
+ 私は直接DOMを見ていないので推測で答えますが、
40
+ 各article配下は
41
+ ```html
42
+ <article>
43
+ <p>1</p>
44
+ <p>テキスト</p>
45
+ <p></p>
46
+ </article>
47
+ ```
48
+ あるいは
49
+ ```html
50
+ <article>
51
+ 1
52
+ テキスト
53
+
54
+ </article>
55
+ ```
56
+ といった具合に目的のテキスト以外に余計なものが何かしら加わっているのでないでしょうか。
57
+ それらをまんま繋げてやると1\nテキスト\n2\nテキスト\n3\nテキストが出てきてます。
58
+
59
+ つまり1つのarticle要素に含まれているテキストは「数字¥nテキスト¥n」の可能性が高いです。
60
+ スライスを使ってこれらを取り除きましょう。
61
+
62
+ ページ毎に微妙に異なったり、数字が2桁になるようでしたら、
63
+ 大人しく正規表現で取り除いてやるといいでしょう。
64
+ 以下に例を乗っけておくので考えてみてください。
65
+
66
+ ちなみにreのsubという関数は、第3引数の文字列のうち、第1引数の正規表現に当てはまる文字列を、全て第2引数に置換する関数です。
67
+
68
+ ```python
69
+ import re
70
+
71
+ text = 'aa10aiiiu9uu¥n¥neee¥nooo'
72
+ print(text) # aa10aiiiu9uu¥n¥neee¥nooo
73
+
74
+ new_text = re.sub('([0-9]|¥n)', '', text)
75
+ print(new_text) # aaaiiiuuueeeooo
76
+ ```
77
+
78
+ pythonのreにはsub以外にも様々な正規表現に関する関数が用意されているので、
79
+ 気になったら調べてみてください。