Web サイトをスクレイピングする場合、多くの場合、テキスト コンテンツに基づいてページ上の要素を選択する必要があります。これにより、抽出したいデータを正確にターゲットにすることができます。 XML および HTML ドキュメント内のノードを選択するためのクエリ言語である XPath は、 contains()
& text()
機能します。
このガイドでは、XPath 式でこれらのテキスト選択テクニックを活用する方法を詳しく説明します。構文を説明し、例を見ていき、Web スクレイピング時にテキスト コンテンツによって要素を効果的に選択するのに役立ついくつかのベスト プラクティスについて説明します。
contains() を使用してテキストを含む要素を選択する
XPath contains()
関数を使用すると、特定のテキスト部分文字列を含む要素を選択できます。 2 つの引数を取ります。
- 検索対象のノードセット
- 一致するテキストの部分文字列
構文は次のようになります。
//element[contains(text(), "substring")]
これですべてが選択されます element
テキストコンテンツに指定された内容が含まれるノード substring
.
たとえば、次の HTML について考えてみましょう。
<ul>
<li>Apples</li>
<li>Oranges</li>
<li>Pears and Grapes</li>
</ul>
すべてを選択するには <li>
テキスト「および」を含む要素の場合は、次のように使用します。
//li[contains(text(), "and")]
これは 3 番目と一致します <li>
要素「梨とブドウ」。
contains()
関数はデフォルトで大文字と小文字が区別されます。大文字と小文字を区別しない一致を実行するには、 lower-case()
or upper-case()
大文字と小文字を正規化する関数:
//li[contains(lower-case(text()), "and")]
の主な機能 contains()
それは、部分文字列の一致が子要素にまたがることができるということです。たとえば、この HTML では次のようになります。
<p>
Select <em>this</em> paragraph.
</p>
XPath //p[contains(text(), "Select this")]
まだ一致します <p>
「Select」と「this」はタグで区切られていますが、 <em>
子要素。
text() を使用して正確なテキストで要素を選択する
一方、 contains()
はテキストの部分一致に便利ですが、テキスト コンテンツ全体を正確に一致させる必要がある場合もあります。ここは、 text()
この関数は、全文コンテンツに基づいて要素を選択します。
構文は次のとおりです。
//element[text()="exact text"]
たとえば、次の HTML の場合:
<div>
<p>Hello world!</p>
<p>Hello again</p>
</div>
XPath式 //p[text()="Hello world!"]
最初のものだけを選択します <p>
要素。二番目 <p>
要素は一致しません。テキストの内容が正確には「Hello world!」ではないためです。
取消 contains()
text()
この関数は、要素の直接のテキスト コンテンツのみと一致します。子要素内のテキストとは一致しません。例えば、 //div[text()="Hello world!"]
上記の HTML のいずれにも一致しません。 <div>
それ自体には、「Hello world!」というテキストが直接含まれていません。そのテキストは次の範囲内にあります <p>
子要素。
いいね contains()
text()
関数はデフォルトで大文字と小文字が区別されます。同じ lower-case()
or upper-case()
大文字と小文字を区別しない照合に回避策を使用できます。
テキスト セレクターと他の XPath 式の組み合わせ
テキスト セレクターは、タグ名、属性、位置セレクターなどの XPath 式の他の部分と組み合わせるとさらに強力になります。これにより、必要な要素に正確にドリルダウンするための、非常に的を絞ったセレクターを作成できます。
たとえば、次の XPath を使用して選択できます。 <a>
リンク テキストに単語「click」を含む要素。ただし、クラス「cta-button」も持っている場合に限ります。
//a[contains(text(), "click") and @class="cta-button"]
または、この式で 3 番目を選択します <p>
ページ上の要素。ただし、テキスト コンテンツが「はじめに」で始まる場合に限ります。
//p[starts-with(text(), "Introduction")][3]
さまざまな XPath 構造を組み合わせて一致させることで、ほぼすべての Web スクレイピング シナリオを処理するための非常に特殊なセレクターを構築できます。
Python ライブラリを使用したテキスト セレクターの例
一般的な Python Web スクレイピング ライブラリで XPath テキスト セレクターを使用する実際の例をいくつか見てみましょう。
lxml とリクエストの例
import requests
from lxml import html
# Send a GET request to the webpage
page = requests.get(‘https://example.com‘)
# Parse the HTML content
tree = html.fromstring(page.content)
# Select all <a> elements that contain the text "click me"
links = tree.xpath(‘//a[contains(text(), "click me")]‘)
# Print the href attribute of each selected link
for link in links:
print(link.get(‘href‘))
BeautifulSoup の例
import requests
from bs4 import BeautifulSoup
# Send a GET request to the webpage
page = requests.get(‘https://example.com‘)
# Parse the HTML content
soup = BeautifulSoup(page.content, ‘html.parser‘)
# Select the first <p> element that starts with the text "Introduction"
intro_para = soup.select_one(‘p[text^="Introduction"]‘)
print(intro_para.text)
Selenium を使用した例
from selenium import webdriver
from selenium.webdriver.common.by import By
# Launch a browser and navigate to the webpage
driver = webdriver.Chrome()
driver.get(‘https://example.com‘)
# Select the <button> element with the exact text "Submit"
submit_button = driver.find_element(By.XPATH, ‘//button[text()="Submit"]‘)
submit_button.click()
ヒントとベストプラクティス
Web スクレイピングに XPath テキスト セレクターを使用する場合は、次のヒントに留意してください。
照合しようとしているテキスト内の空白に注意してください。余分なスペースや改行文字があると、セレクターが失敗する可能性があります。必要に応じて、normalize-space() を使用して先頭と末尾の空白を削除し、内部の空白を折りたたみます。
大文字と小文字の区別に注意してください。デフォルトでは、XPath でのテキストの一致では大文字と小文字が区別されます。大文字と小文字を区別しない一致には、 lower-case() または uppercase() を使用します。
過度に一般的なテキスト セレクターは、意図しない要素と一致する可能性があるため避けてください。テキスト セレクターを要素名または属性と組み合わせて、より具体的なものにするようにしてください。
実際の現在のページ コンテンツに対してセレクターを常にテストしてください。 Web サイトは頻繁に変更されるため、テキスト コンテンツが更新されると、昨日まで機能していたセレクターが今日は機能しなくなる可能性があります。
Web サイトに一貫性のない書式設定やユーザーが作成したコンテンツがある場合、テキスト セレクターは信頼できない可能性があります。このような場合、多くの場合、要素名、属性、またはドキュメント ツリー内の位置に基づいた構造セレクターを使用する方が適切です。
まとめ
XPath は、テキストの内容に基づいて要素を選択する強力な方法を提供します。 contains()
& text()
機能します。 contains()
特定のテキスト部分文字列を含む要素を照合する場合に便利です。 text()
正確な全文コンテンツによって要素を選択します。
これらのテキスト セレクターは、他の XPath 式と組み合わせて、Web スクレイピング用の高度にターゲットを絞った要素セレクターを作成すると、さらに効果的になります。
ただのそれを超えて contains()
& text()
, XPath には他にもテキストを操作するための便利な関数がいくつかあります。 starts-with()
, ends-with()
, normalize-space()
、 もっと。 XPath 構文のこれらおよびその他の重要な部分の学習に時間を投資してください。
XPath テキスト セレクターをしっかりと理解すれば、Web ページから必要なデータを正確にターゲットして抽出できるようになります。ハッピースクレイピング!