파이썬의 XPath 구문과 파충류 LXML 모듈

XPath는 구문 및 LXML 모듈

XPath는 무엇입니까?

XPath는 (XML 경로 언어)는 XML과 HTML 문서의 언어로 정보를 찾을 요소를 탐색하는 데 사용 XML 및 HTML 문서 속성 수있다.

XPath는 개발 도구

  1. 플러그인 크롬의 XPath 도우미.
  2. 파이어 폭스 플러그인은 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을에 사용 :

  1. 모든 리튬 태그를 가져옵니다 :

     from lxml import etree
    
     html = etree.parse('hello.html')
     print type(html)  # 显示etree.parse() 返回类型 result = html.xpath('//li') print(result) # 打印<li>标签的元素集合 
  2. 모든 리튬 요소의 모든 클래스 속성의 값을 가져옵니다 :

     from lxml import etree
    
     html = etree.parse('hello.html')
     result = html.xpath('//li/@class')
    
     print(result)
    
  3. HREF 태그는 다음 리튬 얻을 www.baidu.com라벨의를 :

     from lxml import etree
    
     html = etree.parse('hello.html')
     result = html.xpath('//li/a[@href="www.baidu.com"]')
    
     print(result)
    
  4. 리 태그 아래에있는 모든 범위 태그를 가져 오기 :

     from lxml import etree
    
     html = etree.parse('hello.html')
    
     #result = html.xpath('//li/span')
     #注意这么写是不对的: #因为 / 是用来获取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用双斜杠 result = html.xpath('//li//span') print(result) 
  5. 리튬 태그 모든 클래스에서 레이블을 얻을 :

     from lxml import etree
    
     html = etree.parse('hello.html')
     result = html.xpath('//li/a//@class')
    
     print(result)
    
  6. 에 대응하는 값의 마지막 리튬 HREF 속성을 가져 오기 :

     from lxml import etree
    
     html = etree.parse('hello.html')
    
     result = html.xpath('//li[last()]/a/@href')
     # 谓语 [last()] 可以找到最后一个元素 print(result) 
  7. 컨텐츠 끝에서 두 번째 리튬 요소를 가져옵니다 :

     from lxml import etree
    
     html = etree.parse('hello.html')
     result = html.xpath('//li[last()-1]/a')
    
     # text 方法可以获取元素内容 print(result[0].text) 
  8. 두 번째 방법의 내용 끝에서 두 번째 리튬 요소를 가져옵니다 :

     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

추천

출처www.cnblogs.com/csnd/p/11469337.html