

python,xpathを用いてwebスクレイピングを行っています。  
スクレイピングを行っているサイトは次のとおりです。

[https://www.e-stat.go.jp/stat-
search/files?page=1&toukei=00100405&tstat=000001014549](https://www.e-stat.go.jp/stat-
search/files?page=1&toukei=00100405&tstat=000001014549)

欲しい情報（href属性）をもつタグの抽出が目的なのですが，コードは次のとおりです。

[code]

    import requests
    from bs4 import BeautifulSoup
    from lxml import html
    
    #抽出したいタグ用xpath(ダウンロードファイル在中階層)
    target_xpath = '//a[contains(text(),"主要耐久消費財等の普及・保有状況")]/parent::div/following-sibling::div[3]/div/a[contains(@data-file_type,"CSV")]'
    
    #各年度のデータへの入り口が掲載されているurl
    cause_url = "https://www.e-stat.go.jp/stat-search/files?page=1&toukei=00100405&tstat=000001014549"
    
    #各年度のデータに入る際へのベースとなるurl
    base_url = "https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00100405&tstat=000001014549&cycle=0"
    
    #各年度のデータへの入り口が掲載されているurlのサイトデータ取得
    response = requests.get(cause_url)
    
    #文字化けの防止
    response.encoding = response.apparent_encoding
    
    #各年度データへの入り口が掲載されているサイトの解析
    soup = BeautifulSoup(response.content, "html.parser")
    
    #各年度データへの入り口が掲載されているサイトのurlからdata-value値を取得
    for span in soup.find_all('span', attrs={'data-value1': True, 'data-value2': True}):
        if '3月調査' in span.text:
            val1 = "&tclass1=" + str(span['data-value1'])
            val2 = "&tclass2=" + str(span['data-value2'])
    
            #追加用urlの作成
            add_url = val1 + val2 + "&tclass3val=0"
    
            #各年度データページへのロード用url
            load_url = base_url + add_url
    
            #ダウンロード先webページの解析（pathの取得手段が面倒なためxpathを使用）
            load_request = requests.get(load_url)
            load_html = load_request.text
            load_root = html.fromstring(load_html)
    
            #必要要素を抽出
            seeking_tag = load_root.xpath(target_xpath)
            print(seeking_tag)
    
[/code]

出力結果

[code]

    [<Element a at 0x2584b9b1040>, <Element a at 0x2584b9b17c0>, <Element a at 0x2584b9b1d60>]
    [<Element a at 0x2584b92e680>, <Element a at 0x2584b92e2c0>, <Element a at 0x2584b9b9db0>]
    [<Element a at 0x2584c3b5e50>, <Element a at 0x2584c3b5c70>, <Element a at 0x2584cf82f40>]
    [<Element a at 0x2584c81a590>, <Element a at 0x2584c81a5e0>, <Element a at 0x2584cd2def0>]
    [<Element a at 0x2584cf82db0>, <Element a at 0x2584c518b80>, <Element a at 0x2584c518360>]
    [<Element a at 0x2584b92e090>, <Element a at 0x2584cf82f40>, <Element a at 0x2584cf82860>]
    [<Element a at 0x2584c81a0e0>, <Element a at 0x2584b92e680>, <Element a at 0x2584b92e2c0>]
    [<Element a at 0x2584c81a5e0>, <Element a at 0x2584b9b99a0>, <Element a at 0x2584b9b9db0>]
    []
    [<Element a at 0x2584c5184a0>, <Element a at 0x2584c81a590>, <Element a at 0x2584c81a5e0>]
    []
    [<Element a at 0x2584c81a0e0>, <Element a at 0x2584b92e680>, <Element a at 0x2584b92e2c0>]
    [<Element a at 0x2584b92e090>, <Element a at 0x2584b9b17c0>, <Element a at 0x2584b9b10e0>]
    [<Element a at 0x2584c3b5e50>, <Element a at 0x2584cd2def0>, <Element a at 0x2584cd2dd60>]
    [<Element a at 0x2584b92e2c0>, <Element a at 0x2584b92e680>, <Element a at 0x2584c3b5c70>]
    [<Element a at 0x2584c5184a0>, <Element a at 0x2584cd2def0>, <Element a at 0x2584cd2dd60>]
    [<Element a at 0x2584c3b5c70>, <Element a at 0x2584c518b80>, <Element a at 0x2584b9b19a0>]
    [<Element a at 0x2584c81a5e0>, <Element a at 0x2584c81a0e0>, <Element a at 0x2584b9b99a0>]
    
[/code]

出力結果は一応出たのですが，この読み方がわかりません。誰かご教授お願い致します。またベストな抽出方法があればそれについてもご教授願います。（pythonによる方法で）


CC BY-SA 4.0
2022-07-13T07:36:46.897
89955
2022-07-13T08:41:37.820
2022-07-13T08:41:37.820
3060
52517
question
python xpath
python,xpathを用いたwebスクレイピングについて


href 属性の値を取得したい場合は、XPATH に `/@href` を追加します。

[code]

    target_xpath = '//a[contains(text(),"主要耐久消費財等の普及・保有状況")]/parent::div/following-sibling::div[3]/div/a[contains(@data-file_type,"CSV")]/@href'
    
[/code]


CC BY-SA 4.0
2022-07-13T07:53:28.843
89957
2022-07-13T07:53:28.843
47127
89955
answer


`<Element a at
0x...>`は`lxml`の[`Element`クラス](https://lxml.de/tutorial.html#the-element-
class)オブジェクトです。  
xpathを使用してhtml要素を取得した場合、合致するElementをリスト形式で取得できます。  
これを`print(seeking_tag)`でそのまま表示しても`Element`クラスオブジェクトが表示されてしまいます。

要素の中身を表示する方法として、Elementの属性は[`attrb`]プロパティでdictとして列挙できます。

**サンプルコード**

[code]

    # 前半のコード省略
            #必要要素を抽出
            seeking_tag = load_root.xpath(target_xpath)
            # print(seeking_tag)
            for state in seeking_tag:
                print(f'hrefは{state.attrib["href"]}です。')
                print(state.attrib)
            break
    
[/code]

**実行結果**

[code]

    hrefは/stat-search/file-download?statInfId=000032190006&fileKind=1です。
    {'href': '/stat-search/file-download?statInfId=000032190006&fileKind=1', 'class': 'stat-dl_icon stat-icon_1 stat-icon_format js-dl stat-download_icon_left', 'data-file_id': '000009108352', 'data-release_count': '1', 'data-file_type': 'CSV', 'tabindex': '22'}
    hrefは/stat-search/file-download?statInfId=000032190011&fileKind=1です。
    {'href': '/stat-search/file-download?statInfId=000032190011&fileKind=1', 'class': 'stat-dl_icon stat-icon_1 stat-icon_format js-dl stat-download_icon_left', 'data-file_id': '000009108357', 'data-release_count': '1', 'data-file_type': 'CSV', 'tabindex': '22'}
    hrefは/stat-search/file-download?statInfId=000032190016&fileKind=1です。
    {'href': '/stat-search/file-download?statInfId=000032190016&fileKind=1', 'class': 'stat-dl_icon stat-icon_1 stat-icon_format js-dl stat-download_icon_left', 'data-file_id': '000009108362', 'data-release_count': '1', 'data-file_type': 'CSV', 'tabindex': '22'}
    
[/code]

なお @metropolis さんの回答にあるように、xpathに`/@属性名`をつけることで属性の値をリスト形式で取得することができます。  
このxpathで返ってくるのは下記形式の文字列リストです。

[code]

    ['/stat-search/file-download?statInfId=000032190006&fileKind=1', '/stat-search/file-download?statInfId=000032190011&fileKind=1', '/stat-search/file-download?statInfId=000032190016&fileKind=1']
    
[/code]


CC BY-SA 4.0
2022-07-13T08:31:28.870
89958
2022-07-13T08:31:28.870
9820
89955
answer