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

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

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

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

2回答

1719閲覧

pythonスクレイピングの要素取得について知恵をお貸しください。

ninginnn

総合スコア35

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

1クリップ

投稿2020/03/18 14:12

編集2020/03/18 14:40

このサイトから
<訳文>の下の所だけをスクレイピングして保存しようと思っています。このページ×5000ページほどです。
以下のように取得をしたいです。

1  かの阿羅漢にして正等覚者(ブッダ)たる世尊に礼拝いたします\n『長部〔経典〕』\n「戒蘊篇」なる聖典....

試した要素取得について

soup.find_all("font", class_="font9")
classで指定する方法は一日中格闘しましたが、他のページには、fontがバラバラかつ、fontタグでないものもある。訳文以外にもfontタグがある場合がある。
if文で頑張って分岐しても絶対にうまくいかない事がわかりました。


x_pathを使う方法
x_pathはバラバラで一貫性が全くないため、使えませんでした。

要素をどのように取得できるでしょうか?
共通する条件としては、「訳文」という文字の下にある。という条件しかないように思えます。
この条件だけで文章を取得する事ができますでしょうか?
ご教授いただけると幸いです。

python

1import time 2from selenium import webdriver 3 4driver = webdriver.Chrome() 5 6url ='https://komyojikyozo.web.fc2.com/' 7driver.get(url) 8driver.implicitly_wait(5) 9 10print(driver.page_source) 11# 表示するフレームを指定しているだけで、左側のメニューや右側の本文はソースに含まれていない。 12 13 14# トップページがフレームに分かれているため、name="main"のフレームに入る 15frame_elem = driver.find_element_by_name('main') 16driver.switch_to.frame(frame_elem) 17driver.implicitly_wait(5) 18 19driver.find_element_by_link_text('『長部』「戒蘊篇」').click() 20driver.implicitly_wait(5) 21driver.find_element_by_link_text('「梵網経」').click() 22driver.implicitly_wait(5) 23driver.find_element_by_link_text('【遍歴行者の物語】').click() 24driver.implicitly_wait(5) 25# 表示に時間がかかるので、スリープで時間をとる 26time.sleep(10) 27 28# さらにフレームに分かれているため、name="frSheet"のフレームに入る 29frame_elem = driver.find_element_by_name('frSheet') 30driver.switch_to.frame(frame_elem) 31driver.implicitly_wait(5) 32 33# 「かの阿羅漢にして…」のelementを取得する 34elem = driver.find_element_by_xpath('/html/body/table/tbody/tr[14]/td[3]') 35 36print(elem.text) 37# かの阿羅漢にして正等覚者(ブッダ)たる世尊に礼拝いたします

以上のコードはこのサイトに入ってx_pathで取得するまでのコードとなります。

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

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

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

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

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

otn

2020/03/18 14:58 編集

具体的な情報が書かれて無いので、一般論だけですが、HTML全体を眺めてXPathで指定します。 人間が見て場所を特定できるのであれば、そのロジックをそのままXpathにします。
guest

回答2

0

ベストアンサー

XPathで、直前のtrのテキストが「訳文」であるを条件にtrを絞り込んだらいけました。

プログラム

selenium.py

1from selenium import webdriver 2import chromedriver_binary 3URL = "https://komyojikyozo.web.fc2.com/dnskv/dn01/dn01c01.htm" 4TIMEOUT = 10 5driver = webdriver.Chrome() 6driver.implicitly_wait(TIMEOUT) 7driver.get(URL) 8 9frame = driver.find_element_by_name("frSheet") 10driver.switch_to.frame(frame) 11 12elems = driver.find_elements_by_xpath("(//tr[preceding-sibling::*[1][td/font[contains(text(),'訳文')]]])") 13 14for i in range(len(elems)): 15 print(elems[i].text) 16

出力

かの阿羅漢にして正等覚者(ブッダ)たる世尊に礼拝いたします 『長部〔経典〕』 「戒蘊篇」なる聖典 「梵網経」(『長部』1) 【遍歴行者の物語】 このように私は聞いた。 ...

あとはページめくってこれを繰り返すだけですね。

投稿2020/03/18 16:51

takeaship

総合スコア129

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

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

ninginnn

2020/03/19 03:00

うわー。ありがとうございます! もっとコードの勉強をしたいと思います。 他の方々も本当にありがとうございました。
guest

0

訳文が含まれる<tr>タグの次の位置にある<tr>タグの三番目の<td>タグを拾うとかですかねえ
住職に訳文くださいとメールでお願いするのが早い気もしますが。最近も更新されているようですし。

投稿2020/03/18 14:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ninginnn

2020/03/18 15:15

ご回答いただきありがとうございます。 住職のかたにデータがあるかメールをしてみました。 確かに 訳文が含まれる<tr>タグの次の位置にある<tr>タグの三番目の<td> この一貫性は見た所ありそうな気がします。 貴重な情報をありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問