XPath는 구문 및 LXML 모듈
XPath는 무엇입니까?
XPath는 (XML 경로 언어)는 XML과 HTML 문서의 언어로 정보를 찾을 요소를 탐색하는 데 사용 XML 및 HTML 문서 속성 수있다.
XPath는 개발 도구
- 플러그인 크롬의 XPath 도우미.
- 파이어 폭스 플러그인은 XPath를보십시오.
XPath는 구문
선택 노드 :
XPath는 XML 문서의 노드 또는 노드 세트를 선택하는 경로 식을 사용합니다. 우리는 기존의 컴퓨터 파일 시스템에서 볼이 경로 표현과 표현은 매우 유사하다.
표현 | 기술 | 예 | 결과 |
---|---|---|---|
노드 이름 | 이 노드의 모든 자식 노드를 선택 | 서점 | 모든 자식 노드 서점을 선택 |
/ | 당신은 상단에있는 경우, 루트 노드의 대표를 선택합니다. 그렇지 않으면, 노드에서 노드를 선택 | /서점 | 루트 요소 서점에서 모든 노드를 선택 |
// | 글로벌 노드에서 노드를 선택하는 위치에 단지 | //책 | 글로벌 노드에서 모든 책 노드를 찾기 |
@ | 노드의 속성을 선택 | // 책 [@price] | 선택 모든 노드는 가격 책 속성이 |
. | 현재 노드 | ./에이 | 현재 노드에서 태그를 선택 |
술어 :
술어가 특정 노드를 찾는 데 사용하거나 지정된 노드에 값이 포함되어 대괄호에 장착되어있다.
아래 표에서, 우리는 조건 몇 가지 경로 표현하고, 표현의 결과를 나열했습니다 :
경로 표현 | 기술 |
---|---|
/ 서점 / 책 [1] | 선택 서점에서 첫 번째 자식 요소 |
/ 서점 / 책 [마지막 ()] | 서점에서 끝에서 두 번째 책 요소를 선택합니다. |
서점 / 책 [위치 () <3] | 서점 앞의 두 개의 하위 요소를 선택합니다. |
// 책 [@price] | 선택 책 요소는 부동산 가격이 |
// 책 [의 @ 가격 = 10] | 책 소자 (10)와 같은 모든 속성의 가격을 선택 |
通配符
* 와일드 카드.
通配符 | 기술 | 예 | 결과 |
---|---|---|---|
* | 노드와 일치 | /서점/* | 서점 아래의 모든 자식 요소를 선택합니다. |
@ * | 모든 속성은 노드와 일치 | //책[@*] | 속성을 가진 모든 책 요소를 선택합니다. |
복수의 경로를 선택 :
경로 식을 사용하여 "|"오퍼레이터는 다수의 경로를 선택할 수있다.
다음 예는 다음과 같다 :
//bookstore/book | //book/title
# 选取所有book元素以及book元素下所有的title元素
운영자 :
LXML 라이브러리
LXML의 주요 기능을 분석하고 HTML / XML 데이터를 추출하는 것입니다 어떻게 HTML / XML 파서입니다.
lxml이 정기적, C로 구현 한, 고성능 파이썬 HTML / XML 파서, 우리는 신속하게 특정 요소와 노드 정보를 찾을 전에 배우의 XPath 구문을 사용할 수 있습니다.
lxml이 파이썬 공식 문서 : http://lxml.de/index.html
당신은 주사위를 사용하여 설치할 수있는 C 언어 라이브러리를 설치해야합니다 LXML를 설치 PIP
기본 사용 :
우리는 HTML 코드를 구문 분석 그를 사용할 수 있으며, HTML 코드를 분석 할 때, 비표준 HTML 코드 경우, 그는 자동 완성 될 것입니다. 다음 샘플 코드는 다음과 같습니다
# 使用 lxml 的 etree 库
from lxml import etree
text = '''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a> # 注意,此处缺少一个 </li> 闭合标签
</ul>
</div>
'''
#利用etree.HTML,将字符串解析为HTML文档 html = etree.HTML(text) # 按字符串序列化HTML文档 result = etree.tostring(html) print(result)
다음과 같은 결과를 입력 :
<html><body>
<div> <ul> <li class="item-0"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a></li> </ul> </div> </body></html>
당신은 볼 수 있습니다. lxml이 자동으로 HTML 코드를 수정합니다. 예는 리튬 태그를 보완뿐만 아니라, 몸, html 태그를 추가하지.
HTML 코드는 파일에서 읽을 :
직접 문자열을 구문 분석뿐만 아니라, 또한 파일에서 읽기를 지원 LXML. Hello.html 우리는 새로운 파일을 생성 :
<!-- hello.html -->
<div>
<ul> <li class="item-0"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a></li> </ul> </div>
그런 다음 사용하는 etree.parse()
파일을 읽을 방법. 다음 샘플 코드는 다음과 같습니다
from lxml import etree
# 读取外部文件 hello.html
html = etree.parse('hello.html')
result = etree.tostring(html, pretty_print=True) print(result)
그리고 결과는 이전과 동일한입니다 입력합니다.
XPath는 구문 LXML을에 사용 :
-
모든 리튬 태그를 가져옵니다 :
from lxml import etree html = etree.parse('hello.html') print type(html) # 显示etree.parse() 返回类型 result = html.xpath('//li') print(result) # 打印<li>标签的元素集合
-
모든 리튬 요소의 모든 클래스 속성의 값을 가져옵니다 :
from lxml import etree html = etree.parse('hello.html') result = html.xpath('//li/@class') print(result)
-
HREF 태그는 다음 리튬 얻을
www.baidu.com
라벨의를 :from lxml import etree html = etree.parse('hello.html') result = html.xpath('//li/a[@href="www.baidu.com"]') print(result)
-
리 태그 아래에있는 모든 범위 태그를 가져 오기 :
from lxml import etree html = etree.parse('hello.html') #result = html.xpath('//li/span') #注意这么写是不对的: #因为 / 是用来获取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用双斜杠 result = html.xpath('//li//span') print(result)
-
리튬 태그 모든 클래스에서 레이블을 얻을 :
from lxml import etree html = etree.parse('hello.html') result = html.xpath('//li/a//@class') print(result)
-
에 대응하는 값의 마지막 리튬 HREF 속성을 가져 오기 :
from lxml import etree html = etree.parse('hello.html') result = html.xpath('//li[last()]/a/@href') # 谓语 [last()] 可以找到最后一个元素 print(result)
-
컨텐츠 끝에서 두 번째 리튬 요소를 가져옵니다 :
from lxml import etree html = etree.parse('hello.html') result = html.xpath('//li[last()-1]/a') # text 方法可以获取元素内容 print(result[0].text)
-
두 번째 방법의 내용 끝에서 두 번째 리튬 요소를 가져옵니다 :
from lxml import etree html = etree.parse('hello.html') result = html.xpath('//li[last()-1]/a/text()') print(result)
XPath는 요청을 사용하여 영화 천국 크롤링
다음 샘플 코드는 다음과 같습니다
import requests
from lxml import etree
BASE_DOMAIN = 'http://www.dytt8.net'
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36', 'Referer': 'http://www.dytt8.net/html/gndy/dyzz/list_23_2.html' } def spider(): url = 'http://www.dytt8.net/html/gndy/dyzz/list_23_1.html' resp = requests.get(url,headers=HEADERS) # resp.content:经过编码后的字符串 # resp.text:没有经过编码,也就是unicode字符串 # text:相当于是网页中的源代码了 text = resp.content.decode('gbk') # tree:经过lxml解析后的一个对象,以后使用这个对象的xpath方法,就可以 # 提取一些想要的数据了 tree = etree.HTML(text) # xpath/beautifulsou4 all_a = tree.xpath("//div[@class='co_content8']//a") for a in all_a: title = a.xpath("text()")[0] href = a.xpath("@href")[0] if href.startswith('/'): detail_url = BASE_DOMAIN + href crawl_detail(detail_url) break def crawl_detail(url): resp = requests.get(url,headers=HEADERS) text = resp.content.decode('gbk') tree = etree.HTML(text) create_time = tree.xpath("//div[@class='co_content8']/ul/text()")[0].strip() imgs = tree.xpath("//div[@id='Zoom']//img/@src") # 电影海报 cover = imgs[0] # 电影截图 screenshoot = imgs[1] # 获取span标签下所有的文本 infos = tree.xpath("//div[@id='Zoom']//text()") for index,info in enumerate(infos): if info.startswith("◎年 代"): year = info.replace("◎年 代","").strip() if info.startswith("◎豆瓣评分"): douban_rating = info.replace("◎豆瓣评分",'').strip() print(douban_rating) if info.startswith("◎主 演"): # 从当前位置,一直往下面遍历 actors = [info] for x in range(index+1,len(infos)): actor = infos[x] if actor.startswith("◎"): break actors.append(actor.strip()) print(",".join(actors)) if __name__ == '__main__': spider()
크롬 관련 문제 :
판 (62) (최신)에 버그가 아닌 페이지 302 리디렉션 기록 FormData 데이터가 있습니다. 이 버전의 버그입니다. 자세한 내용은 다음 링크를 참조하십시오 https://stackoverflow.com/questions/34015735/http-post-payload-not-visible-in-chrome-debugger를.
: 카나리아 버전은이 문제를 해결했다, 당신은이 버전은 다음 링크에서 계속 다운로드 할 수 있습니다 https://www.google.com/chrome/browser/canary.html