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

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

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

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

Q&A

解決済

2回答

749閲覧

python-readabilityを使い、style属性を含んだままブログの本文を抽出したい

wotaku

総合スコア13

Python 3.x

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

0グッド

0クリップ

投稿2018/02/18 22:30

前提・実現したいこと

python-readabilityというライブラリを使い、style属性を含んだままHTMLタグと本文を抽出したいのですがうまくいきません。
class属性やaタグのhref属性などは残っているのですがstyle属性はなぜか消えてしまうのです。
『python-readability style attribute』等調べてみましたが、解決に至るようなものはヒットしませんでした。
もしpython-readabilityで難しければ、他にブログからHTMLタグを全て維持したまま本文を抽出できる別のライブラリ等を教えていただけると幸いです。

ソースコード

python

1import requests 2from readability.readability import Document 3response = requests.get('http://********.com') 4doc = Document(response.text) 5print(doc.summary())

html

1<!-- http://********.com --> 2<!DOCTYPE html> 3<head> 4 <title>Example</title> 5</head> 6<body> 7 <div>本文以外の要素</div> 8 <!-- 本文 --> 9 <p class="dummy" style="font-weight: 14px; color: red;">ダミーテキストダミーテキストダミーテキスト</p> 10 <!-- 本文 --> 11 <div>本文以外の要素</div> 12</body> 13</html>

結果

html

1<p class="dummy">ダミーテキストダミーテキストダミーテキスト</p>

実現したい結果

html

1<p class="dummy" style="font-weight: 14px; color: red;">ダミーテキストダミーテキストダミーテキスト</p>

試したこと

doc.html()など、別のメソッドを試してみましたがうまくいきませんでした。(Noneと返される)

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

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

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

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

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

guest

回答2

0

https://github.com/buriy/python-readability/blob/master/readability/readability.py#L178
意図的に取り除かれて、オプションもありませんね。

よく見かけるものとしては、BeautifulSoupとかでしょうか。

python

1import requests 2from bs4 import BeautifulSoup 3 4url = '' 5response = requests.get(url) 6doc = BeautifulSoup(response.text, 'lxml') 7print(doc.body.p)

投稿2018/02/19 05:28

mkgrei

総合スコア8560

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

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

wotaku

2018/02/19 10:38

回答ありがとうございます。 BeautifulSoupですとあらゆる形式のブログを扱った時に本文の抽出が難しくなってしまいます。
guest

0

ベストアンサー

lxmlが利用できない環境しか手元にないため、ヒントだけ。

https://github.com/buriy/python-readability/blob/master/readability/cleaners.py

で、stylebad_attrsに指定されているためにクリーンナップ対象として取り除かれるようです。

readability.cleaners.htmlstripを動的に書き換えて(モンキーパッチングして)やれば、期待する動作は実現できると思います。

投稿2018/02/19 00:27

YouheiSakurai

総合スコア6142

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

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

wotaku

2018/02/19 10:38

回答ありがとうございます。 GitHubの使い方をイマイチ理解しておらずファイル一覧をチェックするという作業が完全に抜けておりました…。 site_packages内にあるcleaners.pyファイルを直接書き換えるという方法では上手くいったのですが、動的な書き換えというものがよくわかりません。 試しに  from readability.cleaners import bad_attrs  bad_attrs = ['width', 'height', 'background[-a-z]*', 'on*']  from readability.readability import Document とやってみましたがだめでした。 "動的な書き換え"という部分についてもう少し詳しく教えていただけると幸いです。
YouheiSakurai

2018/02/19 10:58

import readability.cleaners readability.cleaners.htmlstrip = re.compile("<" # open "([^>]+) " # prefix "(?:%s) *" % ('|'.join(bad_attrs),) + # undesirable attributes '= *(?:%s|%s|%s)' % (non_space, single_quoted, double_quoted) + # value "([^>]*)" # postfix ">" # end , re.I) みたいな事を意図してました。完動コードを提示できなくて申し訳ないのですが。
wotaku

2018/02/19 11:16

YouheiSakurai様、回答ありがとうございます。 こういった記法があるのですね、非常に参考になりました。 これらの知識を踏まえて自分なりに試行錯誤してみます。 mkgrei様、回答ありがとうございます。 モンキーパッチとはこのようなものなのですね。 想像以上に複雑で何やら難しそうです…。 当方の勉強不足が否めない状態ですのでPythonに関する構文等について改めて勉強してみます。 ご回答くださった方々本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問