@hirano20020213

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

HTMLの取得が上手くいかない

HTMLの取得が上手くいかない

プログラム初心者です。麻雀の解析のために下記のURLの本文(対局データ)のコピーが必要なのですが、空の文章が返ってきてしまいます。色々試しましたが、自分一人では解決できませんでした。良ければ皆さまのお力をお借りしたいです。

[URLと画像]
https://tenhou.net/0/log/?2022010100gm-00b9-0000-5426d370
image.png

発生している問題・エラー

出ているエラーメッセージを入力
```AttributeError: 'NoneType' object has no attribute 'get_text'

該当するソースコード

import requests
from bs4 import BeautifulSoup

# URLを指定
url = 'https://tenhou.net/0/log/?2022010100gm-00b9-0000-5426d370'

# URLからHTMLを取得
response = requests.get(url)

# レスポンスのステータスコードが200(成功)の場合
if response.status_code == 200:
    # BeautifulSoupオブジェクトを作成
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # body要素を取得
    body = soup.find('body')
    
    # body要素内のテキストを取得
    body_text = body.get_text()
    
    # テキストファイルに保存
    with open('output.txt', 'w', encoding='utf-8') as file:
        file.write(body_text)
        print("HTMLのbody部分をテキストファイルに保存しました。")
else:
    print("URLからデータを取得できませんでした。")

自分で試したこと

url.libも試しましたが、こちらも空で返ってきました。

0 likes

2Answer

レスポンスを見りゃ分かるようにHTMLじゃないのでhtmlとして解析することはできません.
開発者ツールのその画面はDOMの動きをデバッグするためにブラウザの解釈結果を表示しているため,リクエストへの応答を正確に反映していません.

一応XML形式ではあるようなので,適当なXMLパーサにかけて解析してみてください.

1Like

socketなら受信できます。
どこのサーバか知りませんが、迷惑行為とならない範囲での利用を前提とします。

import socket

hostname, port = "160.16.147.75", 80 #tenhou.net
server_request = \
    "GET /0/log/?2022010100gm-00b9-0000-5426d370 HTTP/1.1\r\n" \
    + "Host: localhost:80\r\n" \
    + "User-Agent: curl/7.68.0\r\n" \
    + "Accept: */*\r\n\r\n"
print(f"request:\n{server_request}")
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(5.0)
    s.connect_ex( (hostname, port) )
    #s.settimeout(None)
    ret = s.sendall(bytes(server_request, 'utf-8'))
except Exception as e:
    print(f"{e}")
    raise e

try:
    data = s.recv(8192*16)
    print( f"response({len(data)}):")
    print(data.decode('unicode-escape'))
    s.close()
except Exception as e:
    raise e
1Like

Comments

  1. curlコマンドでもできますね。

    $ curl 'https://tenhou.net/0/log/?2022010100gm-00b9-0000-5426d370' >response.txt
    

Your answer might help someone💌