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

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

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

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

Python 3.x

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

Q&A

解決済

2回答

2983閲覧

AWS Lambdaにて 'lxml' というライブラリが使用できないエラーを解決したい

pgm_bakabon

総合スコア61

Beautiful Soup

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

Python 3.x

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

1グッド

1クリップ

投稿2019/02/08 07:06

編集2019/02/08 07:08

前提・実現したいこと

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>', }
firedfly👍を押しています

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

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

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

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

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

guest

回答2

0

'lxml' ではなく 'html5lib' を使用することで解決しました。
やりたかったこと全般を記事にまとめましたのでよかった参考にしてください。

API Gateway + AWS Lambda(Python3)でRSSフィード(JIMDO)を取得(スクレイピング)し、ローカルHTMLファイルで表示する(クロスドメイン問題も対応)
https://qiita.com/pgm_bakabon/items/acde47bf0403bd176e3c

投稿2019/02/22 08:42

編集2019/02/22 08:43
pgm_bakabon

総合スコア61

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

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

0

ベストアンサー

こんにちは。

下の手順でできないでしょうか。
Using Python’s LXML in Amazon Lambda - Azavea - Beyond Dots on a Map

投稿2019/02/08 07:36

firedfly

総合スコア1131

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

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

pgm_bakabon

2019/02/08 08:19 編集

ご教示ありがとうございます。 今試しておりますが、 $ sudo yum install -y gcc libxml2-devel libxslt-devel のコマンドを実行する際にエラーに当たっており調査中です。 [コマンド] $ brew install libxml2-devel libxslt-devel (macのため、yumではなくbrewでインストールしております。) [エラー] Error: No available formula with the name "libxml2-devel" ==> Searching for a previously deleted formula (in the last month)... Warning: homebrew/core is shallow clone. To get complete history run: git -C "$(brew --repo homebrew/core)" fetch --unshallow Error: No previously deleted formula found. ==> Searching for similarly named formulae... Error: No similarly named formulae found. ==> Searching taps... ==> Searching taps on GitHub... Error: No formulae found in taps.
firedfly

2019/02/08 08:35 編集

すいません。Python2.7時代の手順なので変わっているところはあると思います。 ただ、必要なパッケージをセットにしてzipでアップロードするという手順は同じかと。
pgm_bakabon

2019/02/15 01:27

ご回答ありがとうございます。 yumとhomebrewでインストールできるパッケージが異なり、今回のはbrewでインストールできなかったため、"lxml" ではない別ライブラリを探してみました。 代わりに "html5lib" というライブラリを発見し、使って見たところ期待通りの動作は確認できました。 添付いただいた手順どおりはできませんでしたが、回答いただけてなければたどり着いてたかわかりませんでした。 大変助かりました。 お力添えありがとうございました。 Qiitaに実装した方法をまとめて、解決方法としてこちらにURLを添付したいと思います。
firedfly

2019/02/15 02:55

お疲れ様でした! 最新のノウハウを蓄積して頂けるのはたいへんありがたいです。期待してます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問