>백엔드 개발 >파이썬 튜토리얼 >크롤러 구문 분석 방법 5: XPath

크롤러 구문 분석 방법 5: XPath

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼앞으로
2019-06-05 15:36:242713검색

다양한 언어로 크롤링할 수 있지만 python 기반 크롤러가 더 간결하고 편리합니다. 크롤러는 또한 Python 언어의 필수적인 부분이 되었습니다. 크롤러를 구문 분석하는 방법도 여러 가지가 있습니다. 이전 기사에서는 크롤러를 구문 분석하는 네 번째 방법인 PyQuery에 대해 설명했습니다. 오늘은 또 다른 방법인 XPath를 소개합니다.

크롤러 구문 분석 방법 5: XPath

파이썬 크롤러 xpath의 기본 사용#🎜🎜 #

1. 소개

찾을 언어 문서의 정보. XPath는 XML 문서의 요소와 속성을 탐색하는 데 사용할 수 있습니다. XPath는 W3C XSLT 표준의 주요 요소이며 XQuery와 XPointer는 모두 XPath 표현식을 기반으로 구축되었습니다.

2. 설치

pip3 install lxml

​ ​🎜#三、 사용

#🎜 🎜#

1. Import

from lxml import etree

2. 기본 사용법

from lxml import etree
wb_data = """
        <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>
             </ul>
         </div>
        """
html = etree.HTML(wb_data)
print(html)
result = etree.tostring(html)
print(result.decode("utf-8"))

다음 결과를 보면 우리 프린터 html은 다음과 같습니다. 실제로는 Python 객체이고 etree.tostring(html)은 레이블의 누락된 팔과 다리를 완성하는 불완전한 html의 기본 작성 방법입니다.​

<Element html at 0x39e58f0>
<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>

​ 3. 특정 태그의 내용을 가져옵니다(기본 사용). a 태그의 모든 내용을 가져오려면 a 뒤에 슬래시를 추가할 필요가 없습니다. 오류가 보고됩니다.

 

작성 방법 1

html = etree.HTML(wb_data)
html_data = html.xpath(&#39;/html/body/div/ul/li/a&#39;)
print(html)
for i in html_data:
    print(i.text)

<Element html at 0x12fe4b8>
first item
second item
third item
fourth item
fifth item

 # 🎜 🎜#글쓰기 방법 2

(콘텐츠를 찾으려면 태그 바로 뒤에 /text()를 추가하면 됩니다.)

html = etree.HTML(wb_data)
html_data = html.xpath(&#39;/html/body/div/ul/li/a/text()&#39;)
print(html)
for i in html_data:
    print(i)

<Element html at 0x138e4b8>
first item
second item
third item
fourth item
fifth item
#🎜🎜 # #🎜🎜 # 4. html 파일을 열어서 읽어보세요

#使用parse打开html的文件
html = etree.parse(&#39;test.html&#39;)
html_data = html.xpath(&#39;//*&#39;)<br>#打印是一个列表,需要遍历
print(html_data)
for i in html_data:
    print(i.text)

html = etree.parse(&#39;test.html&#39;)
html_data = etree.tostring(html,pretty_print=True)
res = html_data.decode(&#39;utf-8&#39;)
print(res)

#🎜 🎜#Print: #🎜 🎜#
<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>

5. 지정된 경로 아래에 있는 태그의 속성을 인쇄합니다(트래버스를 통해 속성 값을 얻을 수 있으며, 해당 내용을 찾을 수 있음). 태그)

html = etree.HTML(wb_data)
html_data = html.xpath(&#39;/html/body/div/ul/li/a/@href&#39;)
for i in html_data:
    print(i)
#🎜🎜 #Print:

link1.html
link2.html
link3.html
link4.html
link5.html

6. 우리는 ElementTree 객체를 하나씩 가져오기 위해 xpath를 사용한다는 것을 알고 있으므로 필요한 경우 콘텐츠를 찾으려면 데이터 목록을 얻기 위해 순회해야 합니다.

절대 경로 아래의 a 태그 속성이 link2.html과 동일한 것을 발견했습니다.

html = etree.HTML(wb_data)
html_data = html.xpath(&#39;/html/body/div/ul/li/a[@href="link2.html"]/text()&#39;)
print(html_data)
for i in html_data:
    print(i)

인쇄:

['두 번째 항목']

second item

7. 위에서는 모든 절대 경로(각 경로는 루트에서 시작)를 찾고 아래에서는 상대 경로를 찾습니다. 예를 들어 모든 li 태그를 찾습니다. 아래에 a 태그가 있습니다.

html = etree.HTML(wb_data)
html_data = html.xpath(&#39;//li/a/text()&#39;)
print(html_data)
for i in html_data:
    print(i)

Print:

[&#39;first item&#39;, &#39;second item&#39;, &#39;third item&#39;, &#39;fourth item&#39;, &#39;fifth item&#39;]
first item
second item
third item
fourth item
fifth item

8. 위에서는 모든 태그를 찾기 위해 절대 경로를 사용했습니다. 은 href 속성 값과 동일하며 /---절대 경로가 사용됩니다. 다음으로 상대 경로를 사용하여 l 상대 경로 아래의 li 태그 아래에 있는 a 태그 아래의 href 속성 값을 찾습니다. a 태그 뒤에는 double // 가 와야 합니다.

html = etree.HTML(wb_data)
html_data = html.xpath(&#39;//li/a//@href&#39;)
print(html_data)
for i in html_data:
    print(i)

인쇄:

[&#39;link1.html&#39;, &#39;link2.html&#39;, &#39;link3.html&#39;, &#39;link4.html&#39;, &#39;link5.html&#39;]
link1.html
link2.html
link3.html
link4.html
link5.html

9. 상대 경로에서 특정 속성을 확인하는 방법은 절대 경로에서와 비슷하다고 할 수도 있습니다. 동일합니다.

html = etree.HTML(wb_data)
html_data = html.xpath(&#39;//li/a[@href="link2.html"]&#39;)
print(html_data)
for i in html_data:
    print(i.text)

인쇄:

[<Element a at 0x216e468>]
second item

   

  10、查找最后一个li标签里的a标签的href属性   

html = etree.HTML(wb_data)
html_data = html.xpath(&#39;//li[last()]/a/text()&#39;)
print(html_data)
for i in html_data:
    print(i)

 

打印:

[&#39;fifth item&#39;]
fifth item

   

  11、查找倒数第二个li标签里的a标签的href属性

html = etree.HTML(wb_data)
html_data = html.xpath(&#39;//li[last()-1]/a/text()&#39;)
print(html_data)
for i in html_data:
    print(i)

 

打印:

[&#39;fourth item&#39;]
fourth item

   

  12、如果在提取某个页面的某个标签的xpath路径的话,可以如下图:

  //*[@id="kw"] 

  解释:使用相对路径查找所有的标签,属性id等于kw的标签。

크롤러 구문 분석 방법 5: XPath

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from scrapy.selector import Selector, HtmlXPathSelector
from scrapy.http import HtmlResponse
html = """<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <ul>
            <li><a id=&#39;i1&#39; href="link.html">first item</a></li>
            <li><a id=&#39;i2&#39; href="llink.html">first item</a></li>
            <li><a href="llink2.html">second item<span>vv</span></a></li>
        </ul>
        <div><a href="llink2.html">second item</a></div>
    </body>
</html>
"""
response = HtmlResponse(url=&#39;http://example.com&#39;, body=html,encoding=&#39;utf-8&#39;)
# hxs = HtmlXPathSelector(response)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[2]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[@id]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[@id="i1"]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[@href="link.html"][@id="i1"]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[contains(@href, "link")]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[starts-with(@href, "link")]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[re:test(@id, "i\d+")]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[re:test(@id, "i\d+")]/text()&#39;).extract()
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[re:test(@id, "i\d+")]/@href&#39;).extract()
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;/html/body/ul/li/a/@href&#39;).extract()
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//body/ul/li/a/@href&#39;).extract_first()
# print(hxs)
 
# ul_list = Selector(response=response).xpath(&#39;//body/ul/li&#39;)
# for item in ul_list:
#     v = item.xpath(&#39;./a/span&#39;)
#     # 或
#     # v = item.xpath(&#39;a/span&#39;)
#     # 或
#     # v = item.xpath(&#39;*/a/span&#39;)
#     print(v)

위 내용은 크롤러 구문 분석 방법 5: XPath의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제