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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

1960閲覧

BeautifulSoupでのスクレイピングについて

bunta3264

総合スコア15

Beautiful Soup

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

Python 3.x

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

0グッド

0クリップ

投稿2018/10/24 14:58

beautifulsoupでlinkタグの中身を取得したい

スクレイピングの練習として、とあるRSSのデータの取得を行っています。
その中で、<link></link>で囲まれている部分のテキストがどうしても取得できません。

 
対象ページのHTML構造
下記からitem内のテキストを順に取得しようとしています。

html

1<item> 2 <title>タイトル</title> 3 <link>https://hogefuga.php</link> 4 <description>hoge</description> 5</item>

pythonのソースコード
(本来はrequestsでhtmlを取得してきていますが、冗長となるため省略いたしました。)

python

1 2# -*- coding:utf-8 -*- 3 4from bs4 import BeautifulSoup 5 6s = '<item><title>タイトル</title><link>https://hogefuga.php</link><description>hoge</description></item>' 7soup = BeautifulSoup(s, "lxml") 8print(soup.link) 9

発生している問題・エラーメッセージ

上記のコードで実行したところ、Noneが返ってきます。

試したこと

soupをprintしたところ、

print(soup) >> <item><title>タイトル</title><link/>https://hogefuga.php<description>hoge</description></item>

なぜかもともともhtmlのテキストでは<link></link>で囲まれている部分が、

</link>に置き換わってしまい、結果的に ``` soup.link >> None ``` となっているようです。

なぜ書き換わってしまうのか、まったくわからず投稿いたしました。

何卒宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

link タグは空タグなので、HTML の規約上、コンテンツは持たないはずです。
なので、DOMツリー上は以下のように解釈されます。

item
├── title
├── link
├── NavigateString
└── description

もし<link>https://hogefuga.php</link> のようにしているサイトがあるのだとしたら、そのサイトの HTML は間違っています。

mozilla.org

Permitted content None, it is an empty element.

from bs4 import BeautifulSoup s = '<item><title>タイトル</title><link>https://hogefuga.php</link><description>hoge</description></item>' soup = BeautifulSoup(s, "lxml") print(soup.link.next_sibling) # https://hogefuga.php

訂正

質問を見てなかったのですが、RSS なのでパースするのは HTML ではなく、XML ですね。
その場合、パーサーはXML用のものを指定してください。

from bs4 import BeautifulSoup s = '<item><title>タイトル</title><link>https://hogefuga.php</link><description>hoge</description></item>' soup = BeautifulSoup(s, "lxml-xml") print(soup.link) # <link>https://hogefuga.php</link>

公式ドキュメント の Installing a parser の欄を参照してください。

投稿2018/10/24 15:12

編集2018/10/24 15:20
tiitoi

総合スコア21956

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

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

bunta3264

2018/10/24 15:29

大変すばやいご回答ありがとうございます。 夜分にご対応ありがとうございました。 そもそもRSSがXMLだということを理解しておらず、失礼致しました。 大変丁寧なご説明、およびドキュメントのご提示誠にありがとうございます。 これを機にしっかり勉強いたします。 今後ともよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問