

<https://eiga.com/theater/13/>  
のサイトから、映画館の名前と住所を取得したいと思って、参考書を元にこのように書いてみました。

しかし以下のように表示され、住所が表示されません。

`{'url': 'https://eiga.com/theater/13/130301/3271/', 'name': ['アップリンク'],
'address': []}`

どのようにすればいいのかお手上げなので、ぜひアドバイスをいただけないでしょうか？どうぞよろしくお願いします。

[code]

    import time
    import re
    
    import requests
    import lxml.html
    
    def main():
        session = requests.Session()
        response = requests.get('https://eiga.com/theater/13/')
        urls = scrape_list_page(response)
        for url in urls:
            time.sleep(1)
            response = session.get(url)
            theater = scrape_detail_page(response)
            print(theater)
            break
    
    def scrape_list_page(response):
        root = lxml.html.fromstring(response.content)
        root.make_links_absolute(response.url)
    
        for a in root.cssselect('#pref_theaters a'):
            url = a.get('href')
            yield url
    
    def scrape_detail_page(response):
        root = lxml.html.fromstring(response.content)
        theater = {
            'url': response.url,
            'name': [h2.text_content() for h2 in root.cssselect('#main > div.wrap_ctsBox > div > h2')],
            'address': [td.text_content() for td in root.cssselect('#ciBox > table > tbody > tr:nth-child(1) > td')],
        }
        return theater
    
    if __name__ == '__main__':
        main()
    
[/code]


CC BY-SA 4.0
2018-06-12T13:11:27.773
44725
2018-06-14T06:40:09.997
2018-06-14T06:40:09.997
3054
28916
question
python css web-scraping
CSSセレクター ”table > tbody > tr” が lxml で動きません


使用しているCSSセレクタに `tbody` が含まれていますが、対象のHTMLコードでは `tbody` が省略されています。  
`lxml` がパースするのは、このソースコードが対象ですので、`tbody` を削って、

[code]

    #ciBox > table > tr:nth-child(1) > td
    
[/code]

とする必要があります。  
ブラウザなどのDOMではタグが省略された要素が補われますから、上のセレクタはブラウザなどでは動かなくってしまいます。  
例えば `table` と `tr` の間の `>` を削除すれば、どちらの環境でも動くセレクタになります。

[code]

    #ciBox > table tr:nth-child(1) > td
    
[/code]


CC BY-SA 4.0
2018-06-12T14:12:02.763
44726
2018-06-12T14:12:02.763
3054
44725
answer