Python解析ライブラリの使用


解析ライブラリの使用
  • XPath
  • Xpath
  • を使用
  • Beautiful Soup
  • メソッドセレクタ

  • Pyquery
  • 初期化
  • 基本CSSセレクタ
  • ノード
  • を検索する
  • を巡る
  • 取得情報

  • XPath
    Xpathの使用
    XMLドキュメントで情報を検索する言語:
  • XPathの概要は、簡潔で明瞭な道路力選択式を提供する.
  • XPath共通ルール:
  • 式#シキ#
    説明
    nodename
    このノードのすべてのサブノードを選択
    /
    現在のノードから直接サブノードを選択
    //
    現在のノードから子孫ノードを選択
    .
    現在のノードを選択

    現在のノードの親を選択
    @
    属性の選択
    e.g:title[@lang=‘eng’]で、titleという名前で属性langの値がengのノードをすべて選択します.4.インスタンス
    from lxml import etree
    html=etree.parse('./test.html',etree.HTMLParser())#   
    result=etree.tostring(html)#      HTML  ,   bytes  
    print(result.decode('utf-8'))#  str  
    
  • すべてのノード:
  • ```Javascript
    result=html.xpath('//*')#      
    result=html.xpath('//li/a')#   
    result=html.xpath('//a[@href="link4.html/parent::*/@class')#   a       ,      class  
    result=html.xpath('//li[@class="item-0"]')#    
    
     7.     
    
    ```javascript
    from lxml import etree
    html=etree.parse('./test.html',etree.HTMLParser())
    result=html.xpath('//li[@class="item-0"]/a/text()')#        
    result=html.xpath('//li[@class="item-0"]//text()')#          ,                
    print(result)
    

    8.多属性照合
    html=etree.HTML(text)
    result=html.xpath('//li[1]/a/text()')#     li  
    result=html.xpath('//li[last()]/a/text()')#        
    result=html.xpath('//li[position()<3]/a/text()')#      3   
    result=html.xpath('//li[last()-2]/a/text()')#       li  
    print(result)
    
  • ノード軸選択
  • html=etree.HTML(text)
    result=html.xpath('//li[1]/ancestor::div')#  div      
    result=html.xpath('//li[1]/attribute::*')#         
    result=html.xpath('//li[1]/child::a[@href="link1.html"]')#         
    result=html.xpath('//li[1]/descendant::span')#      ,  span
    result=html.xpath('//li[1]/following::*[2]')#             ,              
    result=html.xpath('//li[1]/following-sibling::*')#               
    
    

    Beautiful Soup
  • 基本用法:
  • from bs4 import BeautifulSoup
    soup=BeautifulSoup(html,'lxml')#          
    print(soup.prettify())
    print(soup.title.string)
    

    prettify()メソッドでは奥解析の文字列を標準のインデント形式で出力でき、Beautiful Soupで自動的にフォーマットを訂正できる
  • ノードセレクタはノードの名前を直接呼び出すことでノード要素を選択しstring属性を呼び出すことでノード内のテキストを得ることができる.複数のノードがある場合、最初に一致するノード
  • のみが選択される.
  • 抽出情報(1)取得名:name:soup.title.name(2)取得属性:attrs:ノード選択後呼び出し、soup.p.attrs、soup.p.attrs[‘name’](3)取得内容:string:soup.p.string
  • ネスト選択
  • print(soup.head.title)
    print(type(soup.head.title))
    print(soup.head.title.string)
    The Dormouse's story
    
    The Dormouse's story
    
    
  • 関連選択1.サブノードと子孫ノードprint(soup.p.conents)#戻りタイプリストcontentsで得られた結果は直接サブノードのリストchildrenであり、戻り結果はジェネレータタイプdescendantsであり、すべての子孫ノードを取得2.親ノードと祖父ノードparent:ノードを選択した直接親ノードparentsのみ:すべての祖父ノードを取得3.兄弟ノードsoup.a.next_Sibling次の兄弟要素を取得soup.a.previous_Sibling取得前の兄弟要素list(enumerate(soup.a.next_siblings)取得後の兄弟ノードlist(enumerate(soup.a.previous_siblings)取得前の兄弟ノード
  • メソッドセレクタ
  • CSSセレクタ
  • from bs4 import BeautifulSoup
    soup=BeautifulSoup(html,'lxml')
    print(soup.select('.panel .panel-heading'))
    print(soup.select('ul li'))
    print(soup.select('#list-2 .element'))
    for li in soup.select('li'):
        print('Get Text:',li.get_text())
    print(type(soup.select('ul')[0]))
    

    Pyquery
    初期化
  • 文字列初期化
  • from pyquery import PyQuery as pq
    doc=pq(html)
    print(doc('li'))#      
    
  • URL初期化
  • doc=pq(url='https://cuiqingcai.com')#URL   
    print(doc('title'))
    
  • ファイル初期化
  • doc=pq(filename='demo.html')
    print(doc('li'))
    

    基本CSSセレクタ
    doc=pq(html)
    print(doc('#container .list li'))
    print(type(doc('#container .list li')))
    

    ノードの検索
    doc=pq(html)
    items=doc('.list')
    lis=items.find('li')
    lis=item.children('.active')
    container=items.parent()#    PyQuery  
    parents=item.parents()#
    

    find()は条件を満たすすべてのノードを選択し、結果タイプの場合PyQueryタイプ、検索範囲はノードのすべての子孫ノード、children()メソッドは子ノードのみ、親ノード:parent()、祖父ノード:parents()、兄弟ノード:sibings()
    遍歴する
    #    
    li=doc('.item-0.active')
    print(li)
    print(str(li))
    #    
    lis=doc('li').items()
    for li in lis:
        print(li ,type(li))
    

    情報の取得
  • 取得属性
  • from pyquery import as pq
    doc=pq(html)
    a=doc('.item-0.active a')
    print(a,type(a))
    print(a.attr('href'))#    ,          
    #     
    a=doc('a')
    for item in a.items():
        print(item.attr('href'))
    
  • テキスト
  • を取得
    from pyquery import PyQuery as pq
    doc=pq(html)
    a=doc('.item-0.active a')
    print(a)
    print(a.text())#        
    print(li.html())#       HTML  
    

    結果が複数のノードである場合、html()メソッドは最初のノードの内部HTMLテキストを返し、text()はすべてのノード内部の純テキスト呼び出しitems()メソッドを返した後、1つのジェネレータが得られ、遍歴するとliノードオブジェクトが1つずつ得られ、タイプもPyQueryタイプである.
  • ノード操作
  • from pyquery import PyQuery as pq
    doc=pq(html)
    li=doc('.item-0.active')
    print(li)
    li.remove_class('active')
    print(li)
    li.add_class('active')
    print(li)
    

    結果:activeというclassを削除してまた追加します
    <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
    <li class="item-0"><a href="link3.html"><span class="bold">third item</span></a></li>
    <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
    

    attract()は、最初のパラメータのみを送信します.この属性値を取得し、2番目の修正属性値text()とhtml()を入力してパラメータを割り当てます.
    from pyquery import PyQuery as pq
    doc=pq(html)
    wrap=doc('.wrap')
    wrap.find('p').remove()#  p  ,    
    

    その他のノード操作はjQueryの使用法と一致する
  • 擬似クラスセレクタ