다양한 언어로 크롤링할 수 있지만 python 기반 크롤러가 더 간결하고 편리합니다. 크롤러는 또한 Python 언어의 필수적인 부분이 되었습니다. 크롤러를 구문 분석하는 방법도 여러 가지가 있습니다. 이전 기사에서는 크롤러: 정규식 을 구문 분석하는 세 번째 방법에 대해 설명했습니다. 오늘은 또 다른 방법인 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('li'))
결과는 다음과 같습니다.
# 🎜🎜 #PyQuery는 작성하기가 더 까다롭기 때문에 가져올 때 별칭을 추가하겠습니다.from pyquery import PyQuery as pq
URL 초기화
from pyquery import PyQuery as pq doc = pq(url="http://www.baidu.com",encoding='utf-8')print(doc('head'))
# 🎜🎜#기본 CSS 선택기
html = ''' <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>''' from pyquery import PyQuery as pq doc = pq(html) print(doc('#container .list li'))
여기서 주목해야 할 한 가지는 doc('#container .list li')입니다. 계층적 관계라면 일반적으로 사용되는 CSS 선택기 방법은 다음과 같습니다.
Find element
Child elements
children,find코드 예: html = '''
<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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
print(type(items))
print(items)
lis = items.find('li')
print(type(lis))
print(lis)
결과에서 pyquery를 통해 찾은 결과가 실제로 pyquery 객체임을 알 수 있으며, 위 코드에서 items.find('li')를 계속 검색할 수 있습니다. ul에서 모든 li 태그를 찾으세요
li = items.children() print(type(li)) print(li)
li2 = items.children('.active') print(li2)
parent,parents method
다음 내용을 찾을 수 있습니다. .parent를 통해 상위 요소를 찾습니다. 예는 다음과 같습니다. html = '''<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>'''from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
container = items.parent()
print(type(container))
print(container)
html = ''' <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> ''' from pyquery import PyQuery as pq doc = pq(html) items = doc('.list') parents = items.parents() print(type(parents)) print(parents)
Brother Elements#🎜 🎜#
siblingshtml = ''' <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> ''' from pyquery import PyQuery as pq doc = pq(html) li = doc('.list .item-0.active') print(li.siblings())
이런 식으로 .siblings를 통해 모든 형제 태그를 얻을 수 있습니다. 물론 여기에는 자신의 은 포함되지 않습니다. true in .siblings()
#에서 CSS 선택기를 통해 필터링할 수도 있습니다. 🎜 🎜#
html = ''' <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> ''' from pyquery import PyQuery as pq doc = pq(html) li = doc('.item-0.active') print(li) lis = doc('li').items() print(type(lis))for li in lis: print(type(li)) print(li)
정보 가져오기
속성 가져오기
pyquery object.attr(속성 이름)#🎜 🎜#pyquery object.attr.속성 이름html = '''
<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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.attr('href'))
print(a.attr.href)
많은 경우 html 태그에 포함된 텍스트 정보를 가져와야 하는데, .text()#🎜를 통해 텍스트 정보를 얻을 수 있습니다. 🎜#html = '''
<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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text())
Get html#🎜🎜 #
html = ''' <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> ''' from pyquery import PyQuery as pq doc = pq(html) li = doc('.item-0.active') print(li) print(li.html())
The 결과는 다음과 같습니다:
# 🎜🎜#DOM 작업 addClass、removeClass attr,css 结果如下: remove 结果如下: 위 내용은 크롤러 구문 분석 방법 4: PyQuery의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!
熟悉前端操作的话,通过这两个操作可以添加和删除属性html = '''
<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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.removeClass('active')
print(li)
li.addClass('active')
print(li)
同样的我们可以通过attr给标签添加和修改属性,
如果之前没有该属性则是添加,如果有则是修改
我们也可以通过css添加一些css属性,这个时候,标签的属性里会多一个style属性html = '''
<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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.attr('name', 'link')
print(li)
li.css('font-size', '14px')
print(li)
有时候我们获取文本信息的时候可能并列的会有一些其他标签干扰,这个时候通过remove就可以将无用的或者干扰的标签直接删除,从而方便操作html = '''<div class="wrap">
Hello, World
<p>This is a paragraph.</p>
</div>'''from pyquery import PyQuery as pq
doc = pq(html)
wrap = doc('.wrap')
print(wrap.text())
wrap.find('p').remove()
print(wrap.text())