2017-09-17 28 views
1

The documentation about xpath states that if there is no slash in the xpath, the expression will select elements wherever they are。しかし、Pythonのdoesntの仕事でlxml.htmlでそうしようとpython lxml - 二重スラッシュのないxpathを選択する

:ここ

import requests 
import lxml.html 
s = requests.session() 
page= s.get('http://lxml.de/') 
html = lxml.html.fromstring(page.text) 
p=html.xpath('p') 

pは空のリストです。

代わりにp=html.xpath('//p')を使用する必要があります。

誰でも知っていますか?

+0

W3Schoolsのは、「ドキュメントではありません" W3Cに接続していないサードパーティ製のチュートリアルサイトです。他の人は役に立たないと感じる人もいます。私の見解では、あなたが忘れてしまった細かい部分をすばやく検索するのにはかなり良いことがよくありますが、最初に分かっていなかった概念を説明するのはかなり弱いです。 –

+0

w3schoolsのこの特定のページは、絶対パス式( '/'で始まる)と相対パス式の間のセマンティクスの違いを理解するために絶対に不可欠な概念である "context"または "focus" (通常は要素名で始まる) –

答えて

3

ページはおそらく<p>(つまりルート)ではなく、そのxpath式で想定している<html>である可能性があります。

ダブルスラッシュ//pを使用して、<p>のすべての要素を取得するか、具体的な<p>の絶対参照で下に移動してください。以下は、最初の段落の内容を示しています。等価的に

p = html.xpath('/html/body/div/p') 

print(p[0].text) 
# lxml is the most feature-rich 
# and easy-to-use library 
# for processing XML and HTML 
# in the Python language. 

p = html.xpath('//p') 

print(p[0].text)  
# lxml is the most feature-rich 
# and easy-to-use library 
# for processing XML and HTML 
# in the Python language. 

前進せずに<p>の解析スラッシュ検索パスで前のXPathを必要とするスラッシュ:

div = p = html.xpath('/html/body/div')[0]  
p = div.xpath('p') 

print(p[0].text) 
# lxml is the most feature-rich 
# and easy-to-use library 
# for processing XML and HTML 
# in the Python language. 
+0

あなたの返信のためのThx:私はターゲットデータを取得する方法を知っていた、それはまた私の質問に記載されています。私はちょうど最初に二重スラッシュを取り除き、よりきちんとした表現をしたいと思っていました。私が質問で提供するxpathドキュメントへのリンクを見てください。二重スラッシュを使わないと、式は "nodename"という名前のすべてのノードを選択します。検索された要素がスラッシュなしでルートにあることは明記されていません。実際、それは単一のスラッシュの動作になります。 –

+2

[W3C Schools](https://meta.stackoverflow.com/questions/280478/why-not-w3schools-com)は信頼できるサイトではありません。 * nodename *という名前を付けて、すべてのノードが返るようなXPath式は見たことがありません。ある種のスラッシュが必要です。可能であれば、特定の文脈の中でその銃弾が意味を成すものであることを意味する。しかし、そのコンテキストに到達するには '/'で検索パスが必要です。 – Parfait

+1

このようなコンテキストの例を更新しました。 – Parfait

関連する問題