◎試したいこと
既にアップロードされているHTMLの本文情報を取得したい
◎起きている問題
Htmlの本文(テキスト)内に顔文字として[(> <)]や[(>_<)]が含まれているとそこの本文がうまく取得できずにエラーを起こすことがあります。
[HTMLコード] <title>hogehoge(> <)</title>
このような文字列があると[(> <)]をタグの記号だと誤認して以下のデータ取得でうまく<title>のデータを取得できません。
[pythonコード] r = requests.get(url) soup = BeautifulSoup(r.content , "html.parser") print(soup.find("title").string)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
それはすでにHTMLじゃないので、無理矢理やるとすると、
・手修正で正しいHTMLにしてから処理する
・現れうるパターンが想定できるもの、例えば正規表現で(>.*?<)
にマッチする物だけであれば、正規表現置換で前処理して正しいHTMLにする
とかでしょうか。
投稿2021/06/30 02:49
総合スコア85901
0
駄目なマークアップであってもそれなりに読もうとするその振る舞いは、パーザ側が仕様外で善意でやっていることです。
仕様に則ってないものをどう解釈しても、使っている側が文句を言ったりする筋合いはありません。
それが自分の気に入らないものなら自分でパーザを書くしかないでしょう。
ところでhtml.parserは「こう読んでくれたらいい」感じでパーズしているように思います。
質問の
以下のデータ取得でうまく<title>のデータを取得できません。
が曖昧で、客観的でないのですが、結局いまどうなっていて、どうなったらうれしいんでしょう??
plain
1>>> from bs4 import BeautifulSoup 2 3>>> soup = BeautifulSoup('<title>hogehoge(> <)</title>' , "html.parser") 4 5>>> print(soup.find("title").string) 6hogehoge(> <) 7 8>>> print(soup.find("title")) 9<title>hogehoge(> <)</title>
追記
title要素の前に開かれたままで閉じられていないタグが置かれたりしている、とか、そういう壊れ方でしょうか。
plain
1>>> soup = BeautifulSoup('<broken <title>hogehoge(> <)</title>' , "html.parser") 2 3>>> print(soup.prettify()) 4<broken <title=""> 5 hogehoge(> <) 6</broken> 7 8>>> print(soup.find("title")) 9None
htmlパーザで扱うのが無理なぐらい壊れているのであれば、行単位に正規表現でマッチさせるなどの方が現実的解でしょう。
追記
soupやr.contentを自分の目で見て、これがパーズできないのはありえない=HTMLとして問題ない、と思えるのでしょうか。
これはまともにパーズできなくても仕方ない、と思えるのでしょうか。
なんのページなのか、どんなデータなのかが明らかにされない限り他の人に解決できる話ではありません。
投稿2021/06/30 02:14
編集2021/07/01 00:37総合スコア11235
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/30 02:19
2021/06/30 02:36
2021/06/30 02:37
2021/06/30 02:48 編集
2021/06/30 03:01
0
どうしてもやりたいのであれば以下のようにやるか、やった結果を最後にもとにもどせばよいでしょう。
python
1kao_dict = {"(> <)": "(> <)", "<(`^´)>": "<(`^´)>", "(>口<)": "(>口<)"} 2 3r = requests.get(url) 4replaced_text = r.text 5for before, after in kao_dict.items(): 6 replaced_text = replaced_text.replace(before, after) 7 8soup = BeautifulSoup(replaced_text , "html.parser") 9print(soup.find("title").string)
必要に応じてkao_dict に変改したいパターンを付け加えるのですが、これが面倒です。
また性能も悪いです。
投稿2021/06/30 02:49
総合スコア24670
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
それはHTMLが悪いです。きちんとエンティティで書きましょう。
html
1<title>hogehoge(> <)</title>
投稿2021/06/30 01:42
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/30 02:01
2021/06/30 02:38
2021/06/30 03:02
0
投稿2021/06/30 01:42
編集2021/06/30 01:49総合スコア1282
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/30 02:04 編集
2021/06/30 02:44
2021/06/30 03:03
2021/06/30 03:04
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。