[過去ログ] Pythonのお勉強 Part67 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
265: デフォルトの名無しさん [sage] 2022/06/16(木) 00:20:30.34 ID:cYlpzbPX(1/5) AAS
おま環でしょうか
<div class="message">要素の有り無しに一貫性がないような・・?
要素がネストされているからかと思いきやそうでもなさそうだし
なぜでしょうか

import requests
from bs4 import BeautifulSoup as _soup
url="2chスレ:tech
bs=_soup(requests.get(url).text, "html.parser")
posts=bs.select(".post")
for post in posts:
_print(post)
267: デフォルトの名無しさん [sage] 2022/06/16(木) 01:29:33.24 ID:cYlpzbPX(2/5) AAS
5chの仕様なのですか?
例えば、
headersやipアドレスから5ch側が何かしらレスポンスに反映していたり
スレのソースコードとhtml.parserの相性が悪いとかそういうことではなくて?
bs4で意図した取得ができない5chの仕様とは具体的に何でしょうか >>266
266(1): デフォルトの名無しさん (ワッチョイ e3e0-Y9n/) [sage] 2022/06/16(木) 01:02:42.84 ID:v7fiKns10(1) AAS
5chの仕様にここでなぜといわれても

あとそもそもですが、仮に自分が「これは5chの仕様だな」とわかっていたら
答えがわかっているので質問自体していないと思いますよ

ちなみにソースコードを手動でコピペして成型して
<div class="thread"><div class="post"></div>・・・・</div>
の部分だけをbs4したら上手くいきました
269: デフォルトの名無しさん [sage] 2022/06/16(木) 01:59:31.90 ID:cYlpzbPX(3/5) AAS
>>268
268(1): デフォルトの名無しさん (ワッチョイ cf46-hiZJ) [sage] 2022/06/16(木) 01:38:45.16 ID:5RJuUFJv0(1/3) AAS
ちょっとやってみたけど普通に見える
なにがおかしいの?
普通に見えるとは、
エラーもなにも出ずに該当のレス分だけ再帰できた、ということではなく
該当レスすべてclass="message"のdiv要素も取得できた、ということですか?

自分の場合はprint(post) の結果が
<div class="post"><div class="meta"></div></div>で終わっているものと
<div class="post"><div class="meta"></div><div class="message"><span class="escaped">
のようにmessageまで取得できるものがあります

こういう感じです
画像リンク

改めて手動ソースコピペやってみましたがなぜかできませんでした
(簡単なdomならば意図した通りに取得はできます)
271: デフォルトの名無しさん [sage] 2022/06/16(木) 02:28:08.68 ID:cYlpzbPX(4/5) AAS
>>270
270(1): 268 (ワッチョイ cf46-ffpc) [sage] 2022/06/16(木) 02:14:06.76 ID:5RJuUFJv0(2/3) AAS
私の環境では全部のpostにmessageがありますね
自分のところではやはり消えてしまいます
そして進展があり、最小構成で再現できました

html='''
<div class="thread">
<div class="post">
<div class="meta">
<span class="name"><b>名前1</b>ワッチョイ<b></b></span>
</div>
<div class="message">
<span class="escaped">レス1</span>
</div>
</div>
<div class="post">
<div class="meta">
<span class="name"><b><a href="mailto:sage">名前2</b>ワッチョイ<b></a></b></span>
</div>
<div class="message">
<span class="escaped">レス2</span>
</div>
</div>
</div>
'''#.replace('<b><a href="mailto:sage">',"<b>").replace("<b></a></b>","")

おそらく<b><a href="mailto:sage">名前2</b>ワッチョイ<b></a></b>の部分
なぜかmailto:sageのときは<b></a></b>で挟み込んでいます(この部分を取り除いたらmessageのところが取得できました)
.replace('<b><a href="mailto:sage">',"<b>").replace("<b></a></b>","")を切り替えるとmessage取得できました。
(同じようにreplaceしたres.textはなぜかできませんでしたが・・replace漏れがあっただけかもしれない)
273: デフォルトの名無しさん [sage] 2022/06/16(木) 02:42:16.24 ID:cYlpzbPX(5/5) AAS
.replace('<a href="mailto:sage">',"").replace('</a></b>','</b>')
にしたらいけました。

>>272
272(1): 268 (ワッチョイ cf46-ffpc) [sage] 2022/06/16(木) 02:38:25.71 ID:5RJuUFJv0(3/3) AAS
5chがぶっ壊れたhtmlを返してくるんですね
それだとバージョン違いとかで動作がおかしいことはありえる
parserをhtml5libにしてみるのがいいかもしれません
>html5lib
なるほど
bs=_soup(res.text, "html5lib")
いけました
ありがとうございます!
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 1.358s*