

[Python スクレイピング＆クローリング 増補改訂版](https://gihyo.jp/book/2019/978-4-297-10738-3)
を使ってスクレイピングの勉強をしている初心者です。  
書籍通りに技術評論社のスクレイピングを実行している最中にエラーが出てしまいます。  
特に聞きたいのはp57~p58にかけてのreモジュールのエラーについてです。  
しかしそれまでの経緯も影響していそうなので、全体的なコードの流れも示していきます。

p52で以下のサンプルコードを書籍のまま実行しようとするとcp932というエラーが出ます。

[code]

    import sys
    import requests
    
    url = sys.argv[1]
    r = requests.get(url)
    print(f'encoding: {r.encoding}',file = sys.stderr)
    print(r.text)
    
[/code]

これを回避するために以下のようにコードを修正しました。

[code]

    import sys
    import requests
    
    
    url = sys.argv[1]
    r = requests.get(url)
    
    with open('output.txt', 'w', encoding='utf-8') as f:
        f.write(r.text)
        
        
    print(f'encoding: {r.encoding}',file = sys.stderr)
    
    try:
        print(r.text)
    except UnicodeEncodeError:
        print(r.text.encode(sys.stdout.encoding, errors='replace').decode(sys.stdout.encoding))
    
[/code]

これをrequests_header_encoding.pyのファイル名で保存します。そして以下のコードをコマンドプロンプトで実行します。するとp53のようにencoding:utf-8(以下引用略）と出力されます。

[code]

    requests_header_encoding.py　http://gihyo.jp/dp
    
[/code]

そしてこれをhtmlに変換して保存します。

[code]

    requests_header_encoding.py　http://gihyo.jp/dp > dp.html
    
[/code]

これにより作られたhtmlを開いてみるとページは開けるのですが、文字化けしたままとなっています。

そしてここからが本題の質問したいエラーの部分となります。  
まず書籍の通りのコードを示します。

[code]

    import re
    from html import unescape
    from urllib.parse import urljoin
    
    with open('dp.html') as f:
        html = f.read()
    
    for partial_html in re.findall(r'<a itemprop="url".*?</ul>\s*</a>', html, re.DOTALL):
        url = re.search(r'<a itemprop="url" href="(.*?)".', partial_html).group(1)
        url = urljoin('https://gihyo.jp/', url)
    
        title = re.search(r'<p itemprop="name".*?</p>', partial_html).group(0)
        title = title.replace('<br/>', ' ')
        title = re.sub(r'<.*?>', ' ', title)
        title = unescape(title)
    　　
    　　print(url,title)
    
[/code]

これをscrape_re.pyという名前で保存してコマンドプロンプト実行するとエラーが出ました。  
requests_header_encoding.pyのファイルにおいて以下の修正が影響しているのではと考えました。

[code]

    with open('output.txt', 'w', encoding='utf-8') as f:
        f.write(r.text)
    
[/code]

それ以外の影響も考慮して自分なりに調べたり考えたりしてみて最終的に以下のようなコードにしてみました。

[code]

    import re
    from html import unescape
    from urllib.parse import urljoin
    
    try:
        with open('dp.html', encoding='utf-8') as f:
            html = f.read()
    
        url_list = []
        title_list = []
    
    for partial_html in re.findall(r'<a itemprop="url".*?</ul>\s*</a>', html, re.DOTALL):
        url = re.search(r'<a itemprop="url" href="(.*?)".', partial_html).group(1)
        url = urljoin('https://gihyo.jp/', url)
        
    title = re.search(r'<p itemprop="name".*?</p>', partial_html).group(0)
    title = title.replace('<br/>', ' ')
    title = re.sub(r'<.*?>', ' ', title)
    title = unescape(title)
    
        url_list.append(url)
        title_list.append(title)
                
    for url, title in zip(url_list, title_list):
        print(url, title)
            
    except FileNotFoundError as e:
        print("File not found. Please check the file path.")
        raise e
    
[/code]

しかし結果はエラーが吐き出されました。  
正直いろいろと調べて都度修正していくうちにどれが根本的な原因なのかわからなくなってしまいました。  
最終的な目的はscrape_re.pyというファイルが正常に動くようにしたいです。  
長々となってしまいましたがよろしくお願いします。


CC BY-SA 4.0
2023-07-23T16:21:06.783
95735
2023-07-23T16:35:20.343
2023-07-23T16:35:20.343
3060
59213
question
python web-scraping python-requests
「Python スクレイピング＆クローリング 増補改訂版」に出てくるコードのエラーについて