それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

pythonでHTMLをパースしてXpathする

python でも xpath したい。

libxml でパースするには、lxml を使うと楽

pip install lxml

使い方。

lxml.html を使うと確実に、パースする事ができる。parse は IO を取るのでStringIOを使うことになる。

lxml.html.parse(StringIO(page.html))

サンプル

import lxml.html
from io import StringIO, BytesIO

def parse( node , idx ) :
    name  = node.xpath(".//*[@class='desc-title']//text()")[0]
    url  = node.xpath(".//a/@href")[0]
    img_url  = node.xpath(".//img/@src")[0]
    price = node.xpath('.//div[contains(./@class, "desc-price")]//strong/text()')[0].replace(',','')
    identify_url = page.url + '#' + str(i+1)
    html = lxml.etree.tostring( node ,  pretty_print=True,method='xml', encoding='utf-8').decode('utf-8')
    item = Item(link=url,title=name,price=price,html=html, identify_url=identify_url,img_url=img_url  )
    return session.add(item)


if __name__ == '__main__' : 

    doc = lxml.html.parse(StringIO(page.html))
    ret = doc.xpath("//li[@class='list-item']")

    for i, node in enumerate(ret) : 
      parse( node,i)