python爬虫類(三)xpathとlxml

4442 ワード

XPath
XPathは、xmlドキュメントで要素と属性を巡回するために使用できるxmlで情報を検索する言語です.XPathは、xmlドキュメントでパス式を使用してノードを選択します.ここでは、ノードを選択する親子関係を段階的に表現する必要があることに注意してください.
XPath記号
  • nodenameこのノードのすべてのサブノード
  • を選択する.
  • /ルートノードから
  • を選択する.
  • //は、位置
  • を考慮することなく、選択された現在のノードドキュメントに一致する.
  • .現在のノードを選択します.
  • ..現在のノードの親ノード
  • を選択する.
  • @属性
  • を選択する.
  • *は、パス
  • を示す.
  • |複数の式を接続し、並列動作
  • を行う.
    XPathパス表現
  • bookstore bookstore要素のすべてのサブノードを選択します.
  • /bookstoreルート要素bookstoreを選択します.
  • パスが正のスラッシュから始まる場合.注記:パスが正のスラッシュから始まる場合.注記:パスが正のスラッシュから始まる場合.注記:パスが正のスラッシュ(/(/)から始まる場合、このパスは常にエレメントへの絶対パスを表します.

  • bookstore/book book storeサブエレメント内のすべてのbookエレメントを選択します.
  • //bookドキュメント内の場所にかかわらず、すべてのbook要素を選択します.
  • bookstore//book bookstore bookstore要素の子孫のすべてのbook要素を選択し、bookstoreの下のどの位置にあるかにかかわらず
  • //@auth authという属性
  • をすべて選択する.
    XPath述語
    述部は、このレベルのノードに対するフィルタ条件を表し、一般的な述部は次のとおりです.
  • /book[2]は、このレベルで第2のbookノード
  • が選択することを示す.
  • /book[last()]は、このレベルで最後のbookノード
  • が選択することを示す.
  • /book[position()<5]は、このレベルで選択する前の4つのbookノード
  • を表す.
  • /book[@auth]は、auth属性を有するすべてのbookノード
  • をこのレベルで選択することを示す.
  • /book[@auth="buka"]は、このレベルで選択するauth属性値がbukaのすべてのbookノード
  • を表す.
  • /book[price>35.00]は、このレベルでpriceサブ要素を選択する値が35より大きいbookノード
  • を表す.
    lxmlライブラリ
    lxmlはxml形式のデータを柔軟に処理するためのライブラリであり、Web解析を支援するために使用できます.lxml Web解析で最もよく使われるのはetreeオブジェクトです(lxmlライブラリは3.8バージョン以下に保つ必要があります)
    単純ページ解析
    import requests
    from lxml import etree
    
    res = requests.get('https://www.baidu.com/').text
    #   etree.HTML()      ,    
    html = etree.HTML(res)
    print(html.xpath('string(//*[@id="u1"]/a[@name="tj_trtieba"]/@href)'))

    ページの内容のキャプチャ
    import requests
    from lxml import etree
    from urllib.parse import urljoin
    
    #       requests+lxml   python    
    url = 'http://www.runoob.com/python/python-100-examples.html'
    res = requests.get(url).text
    html = etree.HTML(res)
    li_list = html.xpath('//*[@id="content"]/ul/li')
    exam_list = []
    for li in li_list:
        href = li.xpath('a/@href')
        exam_url = urljoin(url, href[0])
        #     requests       ,          
        exam_res = requests.get(exam_url).content.decode('utf-8')
        exam_html = etree.HTML(exam_res)
        title = exam_html.xpath('string(//*[@id="content"]/h1)')
        quest = exam_html.xpath('string(//*[@id="content"]/p[2])')
        analyse = exam_html.xpath('string(//*[@id="content"]/p[3])')
        code = exam_html.xpath('string(//div[@class="hl-main"]|//pre[@class="prettyprint prettyprinted"])')
        exam_dict = {
            'title': title,
            'quest': quest,
            'analyse': analyse,
            'code': code
        }
        print(exam_dict)
        exam_list.append(exam_dict)
    
    import pandas
    
    df = pandas.DataFrame(exam_list, columns=['title', 'quest', 'analyse', 'code'])
    df.to_csv('exam.csv')