クローラーの解析方法 4: PyQuery

Jun 05, 2019 pm 03:14 PM
python 爬虫類

多くの言語でクロールできますが、python に基づくクローラーはより簡潔で便利です。クローラーも Python 言語の重要な部分になっています。クローラーを解析する方法もたくさんあります。前回の記事では、 クローラーを解析する 3 番目の方法である正規表現 について説明しましたが、今日は別の方法である PyQuery について説明します。

クローラーの解析方法 4: PyQuery

PyQuery

PyQuery ライブラリは、非常に強力で柔軟な Web ページ解析ライブラリでもあります。経験があれば、それを使用できます。jQuery を使用したことがある場合は、PyQuery が最適です。PyQuery は、jQuery をモデルとした Python の厳密な実装です。構文は jQuery とほぼ同じなので、変なメソッドを覚えようとする必要はもうありません。

初期化中に渡すには、通常、文字列で渡す、URL で渡す、ファイルで渡すという 3 つの方法があります。

文字列の初期化

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
ログイン後にコピー

ここで、上記のコードの doc が実際には pyquery オブジェクトであることがわかります。doc を通じて要素を選択できます。実際、これは次のとおりです。 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;))
ログイン後にコピー

ファイル初期化

URL パラメータを渡すことができますまたは、 pq() 内のファイルパラメータ。もちろん、ここでのファイルは通常 HTML ファイルです。例: pq(filename='index.html')

Basic CSS selector

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;))
ログイン後にコピー

Oneここで注意する必要があるのは doc ('#container .list li') です。階層関係があれば、ここで 3 つが隣り合う必要はありません。一般的に使用される CSS は次のとおりです。セレクター メソッド:

クローラーの解析方法 4: PyQuery

要素の検索

子要素
children,find
Code例:

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 オブジェクトであることもわかり、検索を続行できます。上記のコードの ('li') は、ul 内のすべての li を検索することを意味します。

li = items.children()
print(type(li))
print(li)
ログイン後にコピー

同時に、CSS セレクターは子でも使用できます

li2 = items.children(&#39;.active&#39;) 
print(li2)
ログイン後にコピー

親要素

parent,parents メソッド
例は次のとおりです:

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)
ログイン後にコピー

You can find the先祖ノード 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)
ログイン後にコピー

結果は次のとおりです:結果から、コンテンツの 2 つの部分が返されたことがわかります。1 つは親ノードの情報で、もう 1 つは親ノードの親ノードの情報、つまり祖先ノードの情報です。

同様に、.parents を検索する場合、CSS セレクターを追加してコンテンツをフィルターすることもできます

兄弟要素

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 は互いに隣接しているため、マージされた関係にあり、条件を満たすものは 1 つだけ残ります。 3 番目の項目 そのタグ

この方法で、.siblings を通じてすべての兄弟タグを取得できます。もちろん、ここには独自のタグは含まれません。

同様に、.siblings() では、CSS セレクターを介してフィルター処理することもできます。

Traversal

単一要素

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.attribute name

テキストを取得できることもわかります

多くの場合、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())
ログイン後にコピー

によって取得できます。結果は次のようになります。

クローラーの解析方法 4: PyQuery

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())
ログイン後にコピー

結果は次のとおりです。

クローラーの解析方法 4: PyQueryDOM 操作

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 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

Python hourglassグラフ図面:可変未定義エラーを避ける方法は? Python hourglassグラフ図面:可変未定義エラーを避ける方法は? Apr 01, 2025 pm 06:27 PM

Python:Hourglassグラフィック図面と入力検証この記事では、Python NoviceがHourglass Graphic Drawingプログラムで遭遇する可変定義の問題を解決します。コード...

Pythonクロスプラットフォームデスクトップアプリケーション開発:どのGUIライブラリが最適ですか? Pythonクロスプラットフォームデスクトップアプリケーション開発:どのGUIライブラリが最適ですか? Apr 01, 2025 pm 05:24 PM

Pythonクロスプラットフォームデスクトップアプリケーション開発ライブラリの選択多くのPython開発者は、WindowsシステムとLinuxシステムの両方で実行できるデスクトップアプリケーションを開発したいと考えています...

GoogleとAWSはパブリックピピイメージソースを提供していますか? GoogleとAWSはパブリックピピイメージソースを提供していますか? Apr 01, 2025 pm 05:15 PM

多くの開発者はPypi(PythonPackageIndex)に依存しています...

Pythonで大規模な製品データセットを効率的にカウントしてソートするにはどうすればよいですか? Pythonで大規模な製品データセットを効率的にカウントしてソートするにはどうすればよいですか? Apr 01, 2025 pm 08:03 PM

データの変換と統計:大規模なデータセットの効率的な処理この記事では、製品情報を含むデータリストを別の含有しているものに変換する方法を詳細に紹介します...

Pythonパラメーター注釈は文字列を使用できますか? Pythonパラメーター注釈は文字列を使用できますか? Apr 01, 2025 pm 08:39 PM

Pythonパラメーター注釈の代替使用Pythonプログラミングでは、パラメーターアノテーションは、開発者が機能をよりよく理解して使用するのに役立つ非常に便利な機能です...

Pythonの高解像度画像の処理を最適化して、正確な白い円形領域を見つける方法は? Pythonの高解像度画像の処理を最適化して、正確な白い円形領域を見つける方法は? Apr 01, 2025 pm 06:12 PM

白い領域を見つけるためにPythonで高解像度の画像を処理する方法は? 9000x7000ピクセルの高解像度画像の処理、2つの写真を正確に見つける方法...

See all articles