ChatGPT時代に必要かも!? Pythonで実行するファイルパース(HTML編)

あなたのその HTML もパースします
2023.08.30

こんちには。

データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。

今回はPythonで動作するWebページのパーサーを色々と比較してみます。

よく大規模言語モデルで使用されるLangChainやLlamaIndexなどの既存ライブラリについても確認していきます。

なお、PDF編とPowerPoint編もございますのでそちらも良ければご覧ください。

はじめに

HTMLパースというか単純にブログ記事などをMarkdownのようなフォーマットにしたい場合、記事後半に書いたようなpandocやmarkdownifyがライセンス的にも扱いやすいと思います。

前半で様々なパースライブラリを扱いますが、結論だけ欲しい場合などは末尾の部分に飛んでご確認をお願いします。

(末尾へ飛ぶ場合はこちら

先行事例の実装

今回も先行事例の実装として、よく話題となる以下のライブラリを見ていきます。(今回はざっと)

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の実装があります。

Unstructured.io URL Loader

こちらは、unstructuredというライブラリを使ったパーサーですが、unstructured自体もラッパーであり、最終的にはlxmlというライブラリを使っていそうです。

まずはunstructured/partition/html.pypartition_htmlで処理が開始されます。ここのHTMLDocumentあたりが処理を担っていそうです。

HTMLDocumentは、unstructured/documents/html.pyに定義されていますが、一部は親クラスのXMLDocumentが担っています。

XMLDocumentは以下のunstructured/documents/xml.pyに定義されています。

XMLDocumentHTMLDocumentfrom lxml import etreeで呼び出したetreeを用いてパースしているように見えます。

そのため、本体は以下のlxmlライブラリを使用していそうです。

lxmlライブラリは、BSD licenseとなっています。

Readability Webpage Loader

こちらは、Readability.jsというJavaScriptのライブラリを使ったパーサーとなっています。

ライセンスは、Apache License 2.0となっています。

LangChain

LangChainの場合、以下のクラスがWebページのパーサーに該当しそうでした。

  • WebBaseLoader
    • urllibBeautifulSoupを使うパーサーとなっています
  • UnstructuredURLLoader
    • unstructuredというライブラリを使ったパーサー
  • SeleniumURLLoader
    • seleniumunstructuredというライブラリを使ったパーサー
  • PlaywrightURLLoader
    • playwrightunstructuredというライブラリを使ったパーサー

基本的なパーサーはここまでに出てきたものとなっているようです。

その他のパーサー

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ライセンスではhtml2texttrafilatura、それ以外のライセンスでは、BeautifulSoup4unstructured(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-magicpython-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をパースする皆様のお役に立てば幸いです。