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

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

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

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

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

Q&A

解決済

1回答

2691閲覧

<table><tr>が終了タグしかなくうまくスクレイピングできない

pythonista

総合スコア21

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

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

0グッド

1クリップ

投稿2019/05/03 16:45

編集2019/05/03 16:46

前提・実現したいこと

スクレイピングによってweb上のテーブルタグから情報を抜き出し、CSVファイルを得たい。

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

スクレイピングしたいページ
https://traininfo.jreast.co.jp/delay_certificate/history.aspx?R=06

ここから<table>で書かれた遅延情報を抜き出したいが、ヘッダーの次の日付までは<tr> </tr>で行が形成されているが、次の行から、終了タグ</tr>だけで区切られており、Beautifulsoup4のfind_all('tr')でタグを回収できない。
この場合、この形式のテーブルからどうCSVファイルを抜き出すのかがわからない。

該当のソースコード

python3.7

1ソースコード

from urllib.request import urlopen
from bs4 import BeautifulSoup
import csv

html = urlopen("https://traininfo.jreast.co.jp/delay_certificate/history.aspx?R=06")
bsobj = BeautifulSoup(html, "lxml")

table = bsobj.find_all("table")
rows = table[0].find_all("tr")
↑ここからどうCSVにすればいいかが不明

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

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

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

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

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

mistn

2019/05/04 01:27

以前にも似たような問題で質問していますね。今回も同じ原因なのではないでしょうか。 Beautifulsoup4のパーサについて少し調べてみて、色々試してみて下さい。それでもだめだったときは試したコードと結果を追記してください。
pythonista

2019/05/07 12:46

>mistnさん 申し訳ございません、不勉強でした。破損したタグの取り扱い、パーサーについての知識を今一度勉強しなおします。
guest

回答1

0

ベストアンサー

Beautifulsoupはそんなにタグの破損に強くないので、限界はあると思います。

タグが破損している場合の処理については、ブラウザ側の対応が神すぎて上手く表示処理されてしまっており、サイト運営者が気づかないまま公開されて続けています。コード品質が低い原因の一つだと思っています。

それはさておき、最近はHTMLパーサの動作について共通の規格が策定されつつあり、近代的なパーサであればブラウザと同等の処理ができるように進化しています。

残念ながらBeautifulsoupは古いツールでそのへんは加味していない。。ということなのだと思います。

javascriptだと https://github.com/fb55/htmlparser2 などは有名なのかな?
最近だとpythonよりもNode系、javascriptのライブラリのほうが高機能になっていると思います。

最近のpythonのライブラリはよく知りませんが、新しいものを探してみると良いかもしれません。

投稿2019/05/04 06:03

otolab

総合スコア765

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

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

pythonista

2019/05/07 12:42

大変参考になりました。破損したタグを扱いにくいという点は、目からうろこでした。現在は、破損したHTMLを文字列としてタグを修復し、BeautifulSoup4でパースして扱うパターンに挑戦しています。これが完了したら、otolabさんのおっしゃる新しいライブラリを探してみようと思います。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問