

私は5chのアニメ実況が好きで、異なる2つの実況板の書き込みを取得し、時系列順に並べなおし、一つにまとめることを考えた。

ところが、hawk.5ch.netでの書き込みのスクレイピングができなかった。  
なぜ取得できないか、どうすれば取得できるのか教えていただきたい。

例えば `himawari.5ch.net` のurlでコードを実行するとHTMLが表示されるが、

[code]

    import requests
    from bs4 import BeautifulSoup
    res = requests.get('https://himawari.5ch.net/test/read.cgi/livetx/1523962661/')
    soup = BeautifulSoup(res.text, 'html.parser')
    print(soup)
    
[/code]

`hawk.5ch.net` のurlで実行するとエラーが起きた。

[code]

    import requests
    from bs4 import BeautifulSoup
    res = requests.get('https://hawk.5ch.net/test/read.cgi/livejupiter/1523982845/')
    soup = BeautifulSoup(res.text, 'html.parser')
    print(soup)
    
[/code]


CC BY-SA 4.0
2021-11-09T09:12:34.730
83516
2021-11-09T14:46:37.740
2021-11-09T11:09:20.320
3060
49009
question
python web-scraping beautifulsoup
スクレイピングで5chの書き込みを取得したいができない


`lxml` で行けました。あと文字化けについては、`response.encoding` の指定で直せます。

[code]

    #res = requests.get('https://himawari.5ch.net/test/read.cgi/livetx/1523962661/')
    res = requests.get('https://hawk.5ch.net/test/read.cgi/livejupiter/1523982845/')
    res.encoding = res.apparent_encoding
    soup = BeautifulSoup(res.text, 'lxml')
    print(soup)
    
[/code]


CC BY-SA 4.0
2021-11-09T11:11:24.253
83520
2021-11-09T11:11:24.253
7290
83516
answer


[Beautiful Soup Documentation](https://beautiful-
soup-4.readthedocs.io/en/latest/) を眺めてみると、[Installing a
parser](https://beautiful-soup-4.readthedocs.io/en/latest/#installing-a-
parser) という項目があります。

> Another alternative is the pure-Python html5lib parser, which **parses HTML
> the way a web browser does**. Depending on your setup, you might install
> html5lib with one of these commands:
>
> $ apt-get install python-html5lib
>
> $ easy_install html5lib
>
> $ pip install html5lib

HTML parser を使いたい場合は、こちらの `html5lib` も選択肢の一つに入るでしょう。

[code]

    $ lsb_release -ir
    Distributor ID: Ubuntu
    Release:    21.04
    
    $ pip3 install html5lib
    
[/code]

これで読み込むと問題は発生しません。なお、発生している問題は malformed な HTML
テキスト(クローズタグがないなど)のパースを無制限に行っているためです。

[code]

    import requests
    from bs4 import BeautifulSoup
    
    res = requests.get('https://hawk.5ch.net/test/read.cgi/livejupiter/1523982845/')
    soup = BeautifulSoup(res.content, 'html5lib')
    
    print(soup)
    
[/code]

ここで `res.content` を指定しています。`res.text`
はオリジナル・テキスト(エンコーディングはそのまま)ですが、`res.content` はバイト列になります。バイト列を指定して BeautifulSoup
のインスタンスを初期化すると、内部で文字エンコーディングを推定して、`sys.getdefaultencoding()`
で得られるエンコーディングへ自動的に変換してくれます。


CC BY-SA 4.0
2021-11-09T14:46:37.740
83527
2021-11-09T14:46:37.740
47127
83516
answer