>  기사  >  백엔드 개발  >  크롤러 구문 분석 방법 4: PyQuery

크롤러 구문 분석 방법 4: PyQuery

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

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

크롤러 구문 분석 방법 4: PyQuery

PyQuery

PyQuery 라이브러리는 또한 매우 강력하고 유연한 웹 페이지 구문 분석 도구입니다. 프론트엔드 개발 경험이 있다면 jQuery를 접해 봤어야 합니다. 그렇다면 PyQuery는 jQuery를 모델로 한 엄격한 Python 구현입니다. 구문은 jQuery와 거의 동일하므로 더 이상 이상한 방법을 기억하려고 하지 않아도 됩니다.

초기화 중에 전달하는 방법에는 일반적으로 문자열 전달, URL 전달, 파일 전달의 세 가지 방법이 있습니다.

문자열 초기화

html = 
<div>
    <ul>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
</div>
from pyquery 
import PyQuery as pq
doc = pq(html)print(doc)
print(type(doc))
print(doc(&#39;li&#39;))

결과는 다음과 같습니다.

크롤러 구문 분석 방법 4: PyQuery

# 🎜🎜 #PyQuery는 작성하기가 더 까다롭기 때문에 가져올 때 별칭을 추가하겠습니다.


from pyquery import PyQuery as pq

여기서 위 코드의 문서가 실제로 pyquery 객체임을 알 수 있습니다. 요소를 선택하려면 실제로 CSS 선택기이므로 CSS 선택기의 규칙을 사용할 수 있습니다. 클래스를 가져오려면 직접 doc(태그 이름)을 가져오면 됩니다. 그런 다음 doc('.class_name '), id인 경우 doc('#id_name')....

URL 초기화

from pyquery import PyQuery as pq
doc = pq(url="http://www.baidu.com",encoding=&#39;utf-8&#39;)print(doc(&#39;head&#39;))
# 🎜🎜#파일 초기화#🎜🎜 #

pq()에서 URL 매개변수 또는 파일 매개변수를 전달할 수 있습니다. 물론 여기의 파일은 일반적으로 pq(filename='index.html)와 같은 html 파일입니다. ')

# 🎜🎜#기본 CSS 선택기

html = &#39;&#39;&#39;
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>&#39;&#39;&#39;
from pyquery import PyQuery as pq
doc = pq(html)
print(doc(&#39;#container .list li&#39;))

여기서 주목해야 할 한 가지는 doc('#container .list li')입니다. 계층적 관계라면 일반적으로 사용되는 CSS 선택기 방법은 다음과 같습니다.

Find element크롤러 구문 분석 방법 4: PyQuery

Child elements

children,find

코드 예:

html = &#39;&#39;&#39;
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
&#39;&#39;&#39;
from pyquery import PyQuery as pq
doc = pq(html)
items = doc(&#39;.list&#39;)
print(type(items))
print(items)
lis = items.find(&#39;li&#39;)
print(type(lis))
print(lis)
실행 결과는 다음과 같습니다. 다음과 같이

결과에서 pyquery를 통해 찾은 결과가 실제로 pyquery 객체임을 알 수 있으며, 위 코드에서 items.find('li')를 계속 검색할 수 있습니다. ul에서 모든 li 태그를 찾으세요

물론 여기서도 동일한 효과를 children을 통해 얻을 수 있으며 .children 메서드를 통해 얻은 결과도 pyquery 객체입니다

li = items.children()
print(type(li))
print(li)

동시에 , CSS 선택자는 어린이에서도 사용할 수 있습니다

li2 = items.children(&#39;.active&#39;) 
print(li2)

#🎜 🎜#parent element

parent,parents method

다음 내용을 찾을 수 있습니다. .parent를 통해 상위 요소를 찾습니다. 예는 다음과 같습니다.

html = &#39;&#39;&#39;<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>&#39;&#39;&#39;from pyquery import PyQuery as pq
doc = pq(html)
items = doc(&#39;.list&#39;)
container = items.parent()
print(type(container))
print(container)
through .parents 예는 다음과 같습니다.
html = &#39;&#39;&#39;
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
&#39;&#39;&#39;
from pyquery import PyQuery as pq
doc = pq(html)
items = doc(&#39;.list&#39;)
parents = items.parents()
print(type(parents))
print(parents)

결과는 다음과 같습니다. 결과에서 콘텐츠의 두 부분이 반환되는 것을 알 수 있습니다. 하나는 부모 노드의 정보이고 다른 하나는 부모 노드의 정보입니다. node

마찬가지로 .parents를 통해 검색할 때 CSS 선택기를 추가하여 콘텐츠를 필터링할 수도 있습니다

Brother Elements#🎜 🎜#

siblings

html = &#39;&#39;&#39;
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
&#39;&#39;&#39;
from pyquery import PyQuery as pq
doc = pq(html)
li = doc(&#39;.list .item-0.active&#39;)
print(li.siblings())

코드에서는 doc('.list .item-0.active')의 .tem-0과 .active가 나란히 있어서 같이 표현되는 관계가 있습니다. 조건을 충족하는 것은 하나만 남습니다: 세 번째 항목의 라벨

이런 식으로 .siblings를 통해 모든 형제 태그를 얻을 수 있습니다. 물론 여기에는 자신의 은 포함되지 않습니다. true in .siblings()

Traversal



단일 요소

#에서 CSS 선택기를 통해 필터링할 수도 있습니다. 🎜 🎜#

html = &#39;&#39;&#39;
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
</div>
&#39;&#39;&#39;
from pyquery import PyQuery as pq
doc = pq(html)
li = doc(&#39;.item-0.active&#39;)
print(li)
lis = doc(&#39;li&#39;).items()
print(type(lis))for li in lis:    
print(type(li))    
print(li)
실행 결과는 다음과 같습니다. 결과에서 items()를 통해 생성기를 얻을 수 있고 for 루프를 통해 얻은 각 요소는 여전히 pyquery 객체임을 알 수 있습니다.

정보 가져오기

속성 가져오기

pyquery object.attr(속성 이름)#🎜 🎜#pyquery object.attr.속성 이름

html = &#39;&#39;&#39;
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
&#39;&#39;&#39;
from pyquery import PyQuery as pq
doc = pq(html)
a = doc(&#39;.item-0.active a&#39;)
print(a)
print(a.attr(&#39;href&#39;))
print(a.attr.href)
여기서 속성 값을 얻을 때 직접 a.attr(속성 이름) 또는 a.attr.속성 이름#🎜을 알 수 있습니다. 🎜## 🎜🎜#

Get text

많은 경우 html 태그에 포함된 텍스트 정보를 가져와야 하는데, .text()#🎜를 통해 텍스트 정보를 얻을 수 있습니다. 🎜#

html = &#39;&#39;&#39;
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
&#39;&#39;&#39;
from pyquery import PyQuery as pq
doc = pq(html)
a = doc(&#39;.item-0.active a&#39;)
print(a)
print(a.text())
#🎜🎜 #결과는 다음과 같습니다.

Get html#🎜🎜 #

.html()을 통해 현재 태그에 포함된 html 정보를 얻을 수 있습니다. 예제는 다음과 같습니다.

html = &#39;&#39;&#39;
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
&#39;&#39;&#39;
from pyquery import PyQuery as pq
doc = pq(html)
li = doc(&#39;.item-0.active&#39;)
print(li)
print(li.html())

The 결과는 다음과 같습니다: 크롤러 구문 분석 방법 4: PyQuery

# 🎜🎜#

DOM 작업

addClass、removeClass
熟悉前端操作的话,通过这两个操作可以添加和删除属性

html = &#39;&#39;&#39;
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
&#39;&#39;&#39;
from pyquery import PyQuery as pq
doc = pq(html)
li = doc(&#39;.item-0.active&#39;)
print(li)
li.removeClass(&#39;active&#39;)
print(li)
li.addClass(&#39;active&#39;)
print(li)

attr,css
同样的我们可以通过attr给标签添加和修改属性,
如果之前没有该属性则是添加,如果有则是修改
我们也可以通过css添加一些css属性,这个时候,标签的属性里会多一个style属性

html = &#39;&#39;&#39;
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
&#39;&#39;&#39;
from pyquery import PyQuery as pq
doc = pq(html)
li = doc(&#39;.item-0.active&#39;)
print(li)
li.attr(&#39;name&#39;, &#39;link&#39;)
print(li)
li.css(&#39;font-size&#39;, &#39;14px&#39;)
print(li)

结果如下:

크롤러 구문 분석 방법 4: PyQuery

 

remove
有时候我们获取文本信息的时候可能并列的会有一些其他标签干扰,这个时候通过remove就可以将无用的或者干扰的标签直接删除,从而方便操作

html = &#39;&#39;&#39;<div class="wrap">
    Hello, World
    <p>This is a paragraph.</p>
 </div>&#39;&#39;&#39;from pyquery import PyQuery as pq
doc = pq(html)
wrap = doc(&#39;.wrap&#39;)
print(wrap.text())
wrap.find(&#39;p&#39;).remove()
print(wrap.text())

结果如下:

크롤러 구문 분석 방법 4: PyQuery

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

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