前提・実現したいこと
AWS Lambdaにて、ブログの記事をRSSで取得するプログラムをつくっています。
RSSがHTMLで結果を返すところがあり、そのHTMLから下記2点を実装したいです。
①<img>タグのsrcを抜き取りたい
②<p>の本文を抜き取りたい。
この実現したい箇所でエラーが発生しております。
このエラーの解決方法をご教示いただきたいです。
もしくは、別の方法があればそちらでも構いません。(Lambdaを使用する方向は変えられません。。。)
詳細は以降に記載しております。よろしくお願いいたします。
言語・環境
[環境] AWS Lambda
[開発マシン] macOS High Sierra 10.13.5
[言語] Python3.7.2
[使用ライブラリ]
・feedparser (RSS取得用)
・BeautifulSoup (HTMLをパースさせる用)
・lxml (HTMLをパースさせる用)
[その他]
Lambdaへのアップロードはzipファイルにしてアップしています。
発生している問題・エラーメッセージ
このセクションの次にソースコードは記載しておりますが、
soup = BeautifulSoup(summary, "lxml")
の箇所で以下のエラーが発生しております。
※これはLambdaの環境のみに発生し、ローカルでは実行できます。
{ "errorMessage": "Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?", "errorType": "FeatureNotFound", "stackTrace": [ " File \"/var/task/index.py\", line 39, in lambda_handler\n soup = BeautifulSoup(summary, \"lxml\")\n", " File \"/var/task/bs4/__init__.py\", line 196, in __init__\n % \",\".join(features))\n" ] }
該当のソースコード
import json import feedparser from bs4 import BeautifulSoup import lxml RSS_URL = "RSS取得元のURL" def lambda_handler(event, context): origin = "*" responseBody = { 'message': 'Hello from Lambda', } rss = feedparser.parse(RSS_URL) for entry in rss.entries: # タイトル title = entry.title # ブログへのリンク link = entry.link # 本文・サムネイル画像(HTML形式) summary = entry.summary # lxmlでHTML形式のデータを取得できる形にする(※エラーの該当箇所) soup = BeautifulSoup(summary, "lxml") print(soup) response = { 'statusCode': 200, 'headers': { "x-custom-header" : "my custom header value" }, 'body': json.dumps(responseBody) } return response
試したこと
lxmlを以下のパターンで入れ直したりしておりますが、どのパターンでも発生してしまいます。
①vertialenvでpython3.7.2の状態にして、 pip install lxml -t .
を実行する。
②vertialenvをせずに、 pip install lxml -t .
を実行する。
③vertialenvをせずに、 pip install lxml==3.7.2 -t .
を実行する。
④vertialenvでpython3.7.2の状態にして、 pip install lxml==3.7.2 -t .
を実行する。(※これは実行エラー
)
それぞれworkspaseにてインストールしています。
workspaseのディレクトリ構造
__pycache__ beautifulsoup4-4.7.1.dist-info bs4 env feedparser-5.2.1.dist-info feedparser.py feedparser.pyc index.py (実行プログラムです。これ以外がライブラリのdir or fileです。) lxml lxml-3.7.2.dist-info soupsieve soupsieve-1.7.3.dist-info
RSS情報(feedparserで取得してきたデータ)
{ 'title': u'テスト', 'link': u'http://ブログへのURL', 'summary': u' <div id=""> <div class="" id=""> <figure class=""> <a href="" rel=""> <img alt="" class="" id="" src="画像のURL(ココを取得したい)" /> </a> </figure> <div class="cc-clear"></div> </div> <div class="" id=""> <p>ブログの本文テキスト(ココを取得したい)</p> </div> </div>', }

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。