python爬虫類(三)xpathとlxml
4442 ワード
XPath
XPathは、xmlドキュメントで要素と属性を巡回するために使用できるxmlで情報を検索する言語です.XPathは、xmlドキュメントでパス式を使用してノードを選択します.ここでは、ノードを選択する親子関係を段階的に表現する必要があることに注意してください.
XPath記号 を選択する. を選択する. を考慮することなく、選択された現在のノードドキュメントに一致する. を選択する. を選択する. を示す. を行う.
XPathパス表現 パスが正のスラッシュから始まる場合.注記:パスが正のスラッシュから始まる場合.注記:パスが正のスラッシュから始まる場合.注記:パスが正のスラッシュ(/(/)から始まる場合、このパスは常にエレメントへの絶対パスを表します.
をすべて選択する.
XPath述語
述部は、このレベルのノードに対するフィルタ条件を表し、一般的な述部は次のとおりです. が選択することを示す. が選択することを示す. を表す. をこのレベルで選択することを示す. を表す. を表す.
lxmlライブラリ
lxmlはxml形式のデータを柔軟に処理するためのライブラリであり、Web解析を支援するために使用できます.lxml Web解析で最もよく使われるのはetreeオブジェクトです(lxmlライブラリは3.8バージョン以下に保つ必要があります)
単純ページ解析
ページの内容のキャプチャ
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')