ChatGPT時代に必要かも!? Pythonで実行するファイルパース(HTML編)
こんちには。
データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。
今回はPythonで動作するWebページのパーサーを色々と比較してみます。
よく大規模言語モデルで使用されるLangChainやLlamaIndexなどの既存ライブラリについても確認していきます。
なお、PDF編とPowerPoint編もございますのでそちらも良ければご覧ください。
- ChatGPT時代に必要かも!? Pythonで実行するファイルパース(PowerPoint編) | DevelopersIO
- ChatGPT時代に必要かも!? Pythonで実行するファイルパース(PDF編) | DevelopersIO
はじめに
HTMLパースというか単純にブログ記事などをMarkdownのようなフォーマットにしたい場合、記事後半に書いたようなpandocやmarkdownifyがライセンス的にも扱いやすいと思います。
前半で様々なパースライブラリを扱いますが、結論だけ欲しい場合などは末尾の部分に飛んでご確認をお願いします。
(末尾へ飛ぶ場合はこちら)
先行事例の実装
今回も先行事例の実装として、よく話題となる以下のライブラリを見ていきます。(今回はざっと)
- LlamaIndex
- LlamaHub
- LangChain
LlamaIndex
LlamaIndexの場合、以下のweb.py
というファイルに格納されています。
こちらに以下の3つが実装されています。
SimpleWebPageReader
html2text
というライブラリを使ったパーサー
TrafilaturaWebReader
trafilatura
というライブラリを使ったパーサー
BeautifulSoupWebReader
BeautifulSoup4
というライブラリを使ったパーサ
Readerは基本的は別ライブラリのラッパーとなっており、細かい設定はできないため、用途によっては望ましい出力を得るために直接ライブラリを呼び出した方が良い可能性があります。
html2text
html2text
はHTMLを人間が読みやすいプレーンなテキスト(Markdown形式)に変換するライブラリ(スクリプト)です。
更新が数年前になっています。またライセンスはGPL-3となっているため、使用する際は注意が必要です。
trafilatura
trafilatura
は私も初見だったのですが、こちらはmarkdown以外にも様々な形式でプレーンテキストへの変換に対応しています。
こちらは現在でも頻繁に更新されています。またこちらもライセンスはGPL-3となっているため、使用する際は注意が必要です。
BeautifulSoup4
BeautifulSoup4
はHTMLをより詳細に解析できるパーサーで、プレーンテキストを抽出するというよりは、もっと細かい解析が可能です。
現在も開発されており、MIT Licenseですが、望み通りの結果をプレーンテキストで得るには少し自分自身で検証が必要になるかと思います。
LlamaHub
LlamaHubには、複数のReaderの実装があります。
- Simple Website Loader
- LlamaIndexの
SimpleWebPageReader
と同じものです
- LlamaIndexの
- Beautiful Soup Website Loader
- LlamaIndexの
BeautifulSoupWebReader
と同じものです
- LlamaIndexの
- Unstructured.io URL Loader
unstructured
というライブラリを使ったパーサー
- Readability Webpage Loader
Readability.js
を使ったパーサー
Unstructured.io URL Loader
こちらは、unstructured
というライブラリを使ったパーサーですが、unstructured
自体もラッパーであり、最終的にはlxml
というライブラリを使っていそうです。
まずはunstructured/partition/html.py
のpartition_html
で処理が開始されます。ここのHTMLDocument
あたりが処理を担っていそうです。
HTMLDocument
は、unstructured/documents/html.py
に定義されていますが、一部は親クラスのXMLDocument
が担っています。
XMLDocument
は以下のunstructured/documents/xml.py
に定義されています。
XMLDocument
もHTMLDocument
もfrom lxml import etree
で呼び出したetree
を用いてパースしているように見えます。
そのため、本体は以下のlxml
ライブラリを使用していそうです。
lxml
ライブラリは、BSD licenseとなっています。
Readability Webpage Loader
こちらは、Readability.js
というJavaScriptのライブラリを使ったパーサーとなっています。
ライセンスは、Apache License 2.0となっています。
LangChain
LangChainの場合、以下のクラスがWebページのパーサーに該当しそうでした。
WebBaseLoader
urllib
とBeautifulSoup
を使うパーサーとなっています
UnstructuredURLLoader
unstructured
というライブラリを使ったパーサー
SeleniumURLLoader
selenium
とunstructured
というライブラリを使ったパーサー
PlaywrightURLLoader
playwright
とunstructured
というライブラリを使ったパーサー
基本的なパーサーはここまでに出てきたものとなっているようです。
その他のパーサー
ReadabiliPy
trafilatura
のGitHubページには、様々なパーサーのベンチマークが記載されています。
この中で、trafilatura
より若干性能は劣るもののReadabiliPy
もかなり性能が良さそうです。
ReadabiliPy
は前述のReadability.js
のPythonラッパーのようです。
先行事例の整理
以下のようにまとめました。
種類が多いため漏れがあるかもしれませんが、大筋は抑えられているのではと思います。
ライブラリ | ラッパー | コア | ライセンス(コア) |
---|---|---|---|
LlamaIndex | SimpleWebPageReader | html2text | GNU GPL 3 |
LlamaIndex | TrafilaturaWebReader | trafilatura | GNU GPL 3 |
LlamaIndex | BeautifulSoupWebReader | BeautifulSoup4 | MIT License |
LlamaHub | Simple Website Loader | html2text | GNU GPL 3 |
LlamaHub | Beautiful Soup Website Loader | BeautifulSoup4 | MIT License |
LlamaHub | Unstructured.io URL Loader | unstructured(lxml) | Apache License 2.0 |
LlamaHub | Readability Webpage Loader | Redability.js | Apache License 2.0 |
LangChain | WebBaseLoader | BeautifulSoup4 | MIT License |
LangChain | UnstructuredURLLoader | unstructured(lxml) | Apache License 2.0 |
LangChain | SeleniumURLLoader | unstructured(lxml) | Apache License 2.0 |
LangChain | PlaywrightURLLoader | unstructured(lxml) | Apache License 2.0 |
その他 | ReadabiliPy | Redability.js | Apache License 2.0 |
コアとしては、GPL 3ライセンスではhtml2text
、trafilatura
、それ以外のライセンスでは、BeautifulSoup4
、unstructured(lxml)
、Readability.js
が挙げられます。
ラッパーを含みで一つずつ動かしてみたいと思います。
試してみた
準備
pip install llama-index html2text trafilatura langchain unstructured requests pip install git+https://github.com/alan-turing-institute/ReadabiliPy.git@master#egg=readabilipy
readabilipyは、pip install readabilipy
で入るバージョン0.2.0
がWindowsの文字コードに対応できていなかったので、gitからインストールしています。
pip freeze | grep -e "llama-index" -e "html2text" -e "trafilatura" -e "langchain" -e "readabilipy" -e "unstructured" -e "lxml" -e "requests" pip freeze | grep -e "llama-index" -e "html2text" -e "trafilatura" -e "langchain" -e "readabilipy" -e "unstructured" -e "lxml" -e "requests" -e "playwright" -e "selenium" # html2text==2020.1.16 # langchain==0.0.274 # llama-index==0.8.11.post3 # lxml==4.9.3 # playwright==1.30.0 # readabilipy @ git+https://github.com/alan-turing-institute/ReadabiliPy.git@8905cb9c22d2f813dabe86be5e9e4ea4e1f36df3 # requests==2.31.0 # selenium==4.11.2 # trafilatura==1.6.1 # unstructured==0.10.7
データは以下のブログ記事を使ってみます。
target_urlにパース対象のページを指定しておきます。
target_url = "https://dev.classmethod.jp/articles/openai-gpt35turbo-fine-tuning/"
また、Seleniumを使うパーサーを試される場合は、追加準備として、chrome driverはブラウザ側と合うようにしておき、PATHを通して置く必要があります。
LlamaIndex - SimpleWebPageReader
こちらはHTMLをmarkdown形式にある程度変換できています。(html2text
の特徴です)
from llama_index import SimpleWebPageReader documents = SimpleWebPageReader(html_to_text=True).load_data([ target_url ]) print(documents[0].text)
結果の抜粋です。
こんちには。 データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。 OpenAI APIでgpt-3.5-turboのfine-tuningが可能になったとの発表がありました。 以下がアップデートの概要です。 * 対象 * gpt-3.5-turboでfine-tuningが利用可能に * gpt-3のモデルであるbabbage-002とdavinci-002も新しいfine-tuningでサポート(モデルもGPT baseという扱い) * fuction callingとgpt-3.5-turbo-16kのfine-tuningのサポートは今秋以降に予定 * gpt-4のfine-tuningのサポートは今年後半に予定 fine-tuningのガイドも併せて新しくリリースされています。 それではこれらの詳細を見ていきましょう。 ## アップデートについて ### 対象モデル fine-tuningは現在、以下のモデルで利用可能となっています。 * gpt-3.5-turbo-0613 (recommended) * babbage-002 * davinci-002 gpt-3.5-turboがほとんどの場合には推奨されるようです。 fuction callingとgpt-3.5-turbo-16kによるfine-tuningのサポートは、今秋以降に予定されています。
LlamaIndex - TrafilaturaWebReader
こちらはmarkdown形式でもないプレーンテキストに変換されました。
from llama_index import SimpleWebPageReader documents = SimpleWebPageReader(html_to_text=True).load_data([ target_url ]) print(documents[0].text)
結果の抜粋です。
こんちには。 データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。 OpenAI APIでgpt-3.5-turboのfine-tuningが可能になったとの発表がありました。 以下がアップデートの概要です。 - 対象 - gpt-3.5-turboでfine-tuningが利用可能に - gpt-3のモデルであるbabbage-002とdavinci-002も新しいfine-tuningでサポート(モデルもGPT baseという扱い) - fuction callingとgpt-3.5-turbo-16kのfine-tuningのサポートは今秋以降に予定 - gpt-4のfine-tuningのサポートは今年後半に予定 - データについて - 学習するサンプルは最小10個必要で、50~100個で明確な改善が見られる - サンプルはそれぞれ4096トークン内に収まっている必要がある(越える場合切り捨てられる) - ファイルも50MB以下である必要がある - 学習データはユーザ以外の学習には使用されないが、OpenAI側で安全性のチェックが行われる - 料金 - 学習時の料金はデータのトークン数 x エポック数で決定 - 使用時の料金はfine-tuningなしと比較して8倍の料金がかかるが、GPT-4よりは安価 - レート制限 - Organization単位で「12 jobs per day」となっている fine-tuningのガイドも併せて新しくリリースされています。 それではこれらの詳細を見ていきましょう。 アップデートについて 対象モデル fine-tuningは現在、以下のモデルで利用可能となっています。 - gpt-3.5-turbo-0613 (recommended) - babbage-002 - davinci-002 gpt-3.5-turboがほとんどの場合には推奨されるようです。 fuction callingとgpt-3.5-turbo-16kによるfine-tuningのサポートは、今秋以降に予定されています。
LlamaIndex - BeautifulSoupWebReader
ある程度改行に意味を持たせたプレーンテキストとなりました。
from llama_index import BeautifulSoupWebReader documents = BeautifulSoupWebReader().load_data([ target_url ]) print(documents[0].text)
結果の抜粋です。
【速報】OpenAI APIでGPT-3.5-turboがfine-tuningできるようになりました!! | DevelopersIO produced by Classmethod AWS EC2 IAM Google Cloud ChatGPT Python LINE ビジネス・アナリティクス Looker セミナー 事例 ちょっと話題の記事 【速報】OpenAI APIでGPT-3.5-turboがfine-tuningできるようになりました!! #GPT-4#OpenAI#ChatGPT#機械学習 nokomoro3 2023.08.23 4 126 17 こんちには。 データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。 OpenAI APIでgpt-3.5-turboのfine-tuningが可能になったとの発表がありました。 以下がアップデートの概要です。 対象 gpt-3.5-turboでfine-tuningが利用可能に gpt-3のモデルであるbabbage-002とdavinci-002も新しいfine-tuningでサポート(モデルもGPT baseという扱い) fuction callingとgpt-3.5-turbo-16kのfine-tuningのサポートは今秋以降に予定 gpt-4のfine-tuningのサポートは今年後半に予定 データについて 学習するサンプルは最小10個必要で、50~100個で明確な改善が見られる サンプルはそれぞれ4096トークン内に収まっている必要がある(越える場合切り捨てられる) ファイルも50MB以下である必要がある 学習データはユーザ以外の学習には使用されないが、OpenAI側で安全性のチェックが行われる 料金 学習時の料金はデータのトークン数 x エポック数で決定 使用時の料金はfine-tuningなしと比較して8倍の料金がかかるが、GPT-4よりは安価 レート制限 Organization単位で「12 jobs per day」となっている fine-tuningのガイドも併せて新しくリリースされています。 それではこれらの詳細を見ていきましょう。 アップデートについて 対象モデル fine-tuningは現在、以下のモデルで利用可能となっています。 gpt-3.5-turbo-0613 (recommended) babbage-002 davinci-002 gpt-3.5-turboがほとんどの場合には推奨されるようです。 fuction callingとgpt-3.5-turbo-16kによるfine-tuningのサポートは、今秋以降に予定されています。
LlamaHub - Unstructured.io URL Loader
BeautifulSoupWebReaderに近い結果ですが、改行が統一的に2個はいるような形式となりました。
from llama_index import download_loader UnstructuredURLLoader = download_loader("UnstructuredURLLoader") loader = UnstructuredURLLoader(urls=[ target_url ], continue_on_failure=False, headers={"User-Agent": "value"}) documents = loader.load() print(documents[0].text)
結果の抜粋です。
produced by Classmethod AWS EC2 IAM Google Cloud ChatGPT Python LINE ビジネス・アナリティクス Looker セミナー 事例 ちょっと話題の記事 【速報】OpenAI APIでGPT-3.5-turboがfine-tuningできるようになりました!! #GPT-4 #OpenAI #ChatGPT #機械学習 nokomoro3 2023.08.23 126 17 こんちには。 データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。 OpenAI APIでgpt-3.5-turboのfine-tuningが可能になったとの発表がありました。 以下がアップデートの概要です。 対象 gpt-3.5-turboでfine-tuningが利用可能に gpt-3のモデルであるbabbage-002とdavinci-002も新しいfine-tuningでサポート(モデルもGPT baseという扱い) fuction callingとgpt-3.5-turbo-16kのfine-tuningのサポートは今秋以降に予定 gpt-4のfine-tuningのサポートは今年後半に予定 データについて 学習するサンプルは最小10個必要で、50~100個で明確な改善が見られる サンプルはそれぞれ4096トークン内に収まっている必要がある(越える場合切り捨てられる) ファイルも50MB以下である必要がある 学習データはユーザ以外の学習には使用されないが、OpenAI側で安全性のチェックが行われる 料金 学習時の料金はデータのトークン数 x エポック数で決定 使用時の料金はfine-tuningなしと比較して8倍の料金がかかるが、GPT-4よりは安価 レート制限 Organization単位で「12 jobs per day」となっている fine-tuningのガイドも併せて新しくリリースされています。 それではこれらの詳細を見ていきましょう。 アップデートについて 対象モデル fine-tuningは現在、以下のモデルで利用可能となっています。 gpt-3.5-turbo-0613 (recommended) babbage-002 davinci-002 gpt-3.5-turboがほとんどの場合には推奨されるようです。 fuction callingとgpt-3.5-turbo-16kによるfine-tuningのサポートは、今秋以降に予定されています。
LlamaHub - Readability Webpage Loader
こちらですが、私のPC環境でうまく動作するところまで持っていけなかったため割愛します。
このクラスが依存するplaywrightをjupyter環境で動かすには工夫が必要であったため、別途.py
ファイルを準備して対応しました。
しかし、他にもバージョンの固定が必要などのエラーが出てきたため、今回は解決を諦めています。
コードとしては以下です。
from llama_index import download_loader ReadabilityWebPageReader = download_loader("ReadabilityWebPageReader") loader = ReadabilityWebPageReader() documents = loader.load_data(url=target_url) print(documents[0].text)
LangChain - WebBaseLoader
BeautifulSoupWebReaderとほぼ同じ結果となりました。(内部で使用するモジュールがbs4
で同じであるためと予想されます)
from langchain.document_loaders import WebBaseLoader loader = WebBaseLoader(target_url) documents = loader.load() print(documents[0].dict()["page_content"])
結果の抜粋です。
【速報】OpenAI APIでGPT-3.5-turboがfine-tuningできるようになりました!! | DevelopersIO produced by Classmethod AWS EC2 IAM Google Cloud ChatGPT Python LINE ビジネス・アナリティクス Looker セミナー 事例 ちょっと話題の記事 【速報】OpenAI APIでGPT-3.5-turboがfine-tuningできるようになりました!! #GPT-4#OpenAI#ChatGPT#機械学習 nokomoro3 2023.08.23 4 126 17 こんちには。 データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。 OpenAI APIでgpt-3.5-turboのfine-tuningが可能になったとの発表がありました。 以下がアップデートの概要です。 対象 gpt-3.5-turboでfine-tuningが利用可能に gpt-3のモデルであるbabbage-002とdavinci-002も新しいfine-tuningでサポート(モデルもGPT baseという扱い) fuction callingとgpt-3.5-turbo-16kのfine-tuningのサポートは今秋以降に予定 gpt-4のfine-tuningのサポートは今年後半に予定 データについて 学習するサンプルは最小10個必要で、50~100個で明確な改善が見られる サンプルはそれぞれ4096トークン内に収まっている必要がある(越える場合切り捨てられる) ファイルも50MB以下である必要がある 学習データはユーザ以外の学習には使用されないが、OpenAI側で安全性のチェックが行われる 料金 学習時の料金はデータのトークン数 x エポック数で決定 使用時の料金はfine-tuningなしと比較して8倍の料金がかかるが、GPT-4よりは安価 レート制限 Organization単位で「12 jobs per day」となっている fine-tuningのガイドも併せて新しくリリースされています。 それではこれらの詳細を見ていきましょう。 アップデートについて 対象モデル fine-tuningは現在、以下のモデルで利用可能となっています。 gpt-3.5-turbo-0613 (recommended) babbage-002 davinci-002 gpt-3.5-turboがほとんどの場合には推奨されるようです。 fuction callingとgpt-3.5-turbo-16kによるfine-tuningのサポートは、今秋以降に予定されています。
LangChain - UnstructuredURLLoader
こちらはFileTypeを決めるためにlibmagicというLinuxのパッケージが必要そうです。
Windowsで動かすために、python-magic
とpython-magic-bin
をインストールしてみましたがうまくいきませんでした。
ですのでコードのみを置いておきます。
from langchain.document_loaders import UnstructuredURLLoader loader = UnstructuredURLLoader(urls=[target_url]) documents = loader.load() print(documents[0].dict()["page_content"])
LangChain - SeleniumURLLoader
こちらはSeleinumを使いますが、結果としては「LlamaHub - Unstructured.io URL Loader」と同じような結果となりました。
from langchain.document_loaders import SeleniumURLLoader loader = SeleniumURLLoader(urls=[target_url]) documents = loader.load() print(documents[0].dict()["page_content"])
結果の抜粋です。
produced by Classmethod AWS EC2 IAM Google Cloud ChatGPT Python LINE ビジネス・アナリティクス Looker セミナー 事例 目次 アップデートについて 対象モデル データとトークン制限 料金 レート制限 適したユースケース その他将来的な機能 試してみた パッケージや環境変数 データ準備 データのチェック ファイルのアップロード ジョブ起動 ジョブのステータス確認や操作 結果の確認 fine-tuningモデルを呼び出す APIリファレンス まとめ ちょっと話題の記事 【速報】OpenAI APIでGPT-3.5-turboがfine-tuningできるようになりました!! #GPT-4 #OpenAI #ChatGPT #機械学習 nokomoro3 2023.08.23 126 17 こんちには。 データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。 OpenAI APIでgpt-3.5-turboのfine-tuningが可能になったとの発表がありました。 以下がアップデートの概要です。 対象 gpt-3.5-turboでfine-tuningが利用可能に gpt-3のモデルであるbabbage-002とdavinci-002も新しいfine-tuningでサポート(モデルもGPT baseという扱い) fuction callingとgpt-3.5-turbo-16kのfine-tuningのサポートは今秋以降に予定 gpt-4のfine-tuningのサポートは今年後半に予定 データについて 学習するサンプルは最小10個必要で、50~100個で明確な改善が見られる サンプルはそれぞれ4096トークン内に収まっている必要がある(越える場合切り捨てられる) ファイルも50MB以下である必要がある 学習データはユーザ以外の学習には使用されないが、OpenAI側で安全性のチェックが行われる 料金 学習時の料金はデータのトークン数 x エポック数で決定 使用時の料金はfine-tuningなしと比較して8倍の料金がかかるが、GPT-4よりは安価 レート制限 Organization単位で「12 jobs per day」となっている fine-tuningのガイドも併せて新しくリリースされています。 それではこれらの詳細を見ていきましょう。 アップデートについて 対象モデル fine-tuningは現在、以下のモデルで利用可能となっています。 gpt-3.5-turbo-0613 (recommended) babbage-002 davinci-002 gpt-3.5-turboがほとんどの場合には推奨されるようです。 fuction callingとgpt-3.5-turbo-16kによるfine-tuningのサポートは、今秋以降に予定されています。
LangChain - PlaywrightURLLoader
こちらも「LlamaHub - Readability Webpage Loader」と同様にplaywrightを動かすには、Jupyter環境からでは難しいため、別途.py
ファイルを作成して試してみました。
得られる結果は、「SeleniumURLLoader」とほぼ同じとなりました。
from langchain.document_loaders import PlaywrightURLLoader loader = PlaywrightURLLoader(urls=[target_url], remove_selectors=["header", "footer"]) documents = loader.load() print(documents[0].dict()["page_content"])
結果の抜粋です。
目次 アップデートについて 対象モデル データとトークン制限 料金 レート制限 適したユースケース その他将来的な機能 試してみた パッケージや環境変数 データ準備 データのチェック ファイルのアップロード ジョブ起動 ジョブのステータス確認や操作 結果の確認 fine-tuningモデルを呼び出す APIリファレンス まとめ ちょっと話題の記事 【速報】OpenAI APIでGPT-3.5-turboがfine-tuningできるようになりました!! #GPT-4 #OpenAI #ChatGPT #機械学習 nokomoro3 2023.08.23 126 17 こんちには。 データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。 OpenAI APIでgpt-3.5-turboのfine-tuningが可能になったとの発表がありました。 以下がアップデートの概要です。 対象 gpt-3.5-turboでfine-tuningが利用可能に gpt-3のモデルであるbabbage-002とdavinci-002も新しいfine-tuningでサポート(モデルもGPT baseという扱い) fuction callingとgpt-3.5-turbo-16kのfine-tuningのサポートは今秋以降に予定 gpt-4のfine-tuningのサポートは今年後半に予定 データについて 学習するサンプルは最小10個必要で、50~100個で明確な改善が見られる サンプルはそれぞれ4096トークン内に収まっている必要がある(越える場合切り捨てられる) ファイルも50MB以下である必要がある 学習データはユーザ以外の学習には使用されないが、OpenAI側で安全性のチェックが行われる 料金 学習時の料金はデータのトークン数 x エポック数で決定 使用時の料金はfine-tuningなしと比較して8倍の料金がかかるが、GPT-4よりは安価 レート制限 Organization単位で「12 jobs per day」となっている fine-tuningのガイドも併せて新しくリリースされています。 それではこれらの詳細を見ていきましょう。 アップデートについて 対象モデル fine-tuningは現在、以下のモデルで利用可能となっています。 gpt-3.5-turbo-0613 (recommended) babbage-002 davinci-002 gpt-3.5-turboがほとんどの場合には推奨されるようです。 fuction callingとgpt-3.5-turbo-16kによるfine-tuningのサポートは、今秋以降に予定されています。
ReadabiliPy
こちらは別枠ですが、試してみました。requestsで先にHTMLを取得しておく必要があります。
(得られる結果をプレーンテキストにする方法が不明であっためご参考まで)
import requests from readabilipy import simple_json_from_html_string response = requests.get(target_url) text = simple_json_from_html_string(response.text, use_readability=True)
結果はdictでいくつかのキーがあります。
text.keys() # dict_keys(['title', 'byline', 'date', 'content', 'plain_content', 'plain_text'])
"content"と"plain_content"の違いがわかりませんでしたが、どちらもHTMLのタグ付きとなり、プレーンテキストではないようです。
"plain_text"は要素毎のテキストが格納されていました。
ここからはコアのモジュールで扱う方法を詳しく見ていきます。
html2text
デフォルトではテキスト幅が一定の長さで改行が入ってしまうのですが、以下のようにbodywidth
で設定を変えることが可能です。
import html2text response = requests.get(target_url) text = html2text.html2text(response.text, bodywidth=1000)
また以下のような使い方をすればさらに細かいオプションを設定することもできます。
import html2text response = requests.get(target_url) h = html2text.HTML2Text() # Ignore converting links from HTML h.ignore_links = True text = h.handle(response.text)
より詳細なオプションの一覧はGitHub側で確認ください。
trafilatura
trafilaturaを直接使用する場合は以下のような形です。
from trafilatura import fetch_url, extract # download a web page downloaded = fetch_url(target_url) result = extract(downloaded)
こちらにもオプションが設定できますので、詳細はGitHubのusageでご確認ください。
BeautifulSoup4、lxml
BeautifulSoup4、lxmlは詳細なHTML解析が可能なツールとなっており、プレーンテキストを抽出するのみの用途から少し離れますので今回は割愛します。
その他のアイディア
単純にHTMLをMarkdownに変換すれば事足りるという場合だと、その他のものも選択肢に入ってきます。
pandocのバイナリを使用する
pandocというバイナリを以下から取得できます。
今回はWindows環境でchocoが入っていましたので、以下でインストールしました。
choco install pandoc
HTMLをrequestsなどを使ってファイルに落としておきます。
import requests from readabilipy import simple_json_from_html_string response = requests.get(target_url) response = requests.get(target_url) with open("sample.html", "wt", encoding="utf-8") as f: f.write(response.text)
その後、pandocで変換します。
pandoc -f html -t markdown -i sample.html -o sample.md
pandocはGPL 2ではありますが、バイナリファイルを呼び出す形になるので、選択肢としては良い可能性があります。
markdownify
また少しマイナーなライブラリかもしれませんが、以下のようなmarkdownify
というライブラリもあります。(MITライセンス)
以下で追加インストールします。
pip install markdownify pip freeze | grep -e "markdownify" # markdownify==0.11.6
requestsと組み合わせれば以下のようなパースも可能です。
import requests response = requests.get(target_url) from markdownify import markdownify as md text_md = md(response.text)
ライセンス関連が気になる方はこちらも選択肢に含めると良いかなと思いました。
まとめ
いかがでしたでしょうか。こちらがHTMLをパースする皆様のお役に立てば幸いです。