1

ドキュメント: http://en.wikiquote.org/wiki/The_Matrix

最初のセクション (Neo の引用) のすべての引用 (//ul/li) を取得したいと思います。

//ul[1]/li一部のウィキクォートのページでは、引用がこの形式で表されているため、できません

<h2><span class="mw-headline" id="Neo">Neo</span></h2>  

<ul>
 <li> First quote </li>
</ul> 

<ul>
 <li> Second quote </li>
</ul> 

<h2><span class="mw-headline" id="dont wanna this">Useless</span></h2>  

それ以外の

<ul>
     <li> First quote </li>
     <li> Second quote </li>
</ul>

最初のセクションを取得するためにこれを試しました

(//*[@id='mw-content-text']/ul/preceding-sibling::h2/span[@class='mw-headline'])[1]

しかし、最初のセクションの引用のみを取得するのに問題があります。あなたは私を助けることができます?

4

3 に答える 3

2

使用

(//h2[span/@id='Neo'])[1]/following-sibling::ul
  [count(.
        |
         (//h2[span/@id='Neo'])[1]
            /following-sibling::h2[1]
              /preceding-sibling::ul
         )
  =
   count((//h2[span/@id='Neo'])[1]
            /following-sibling::h2[1]
              /preceding-sibling::ul
         )
  ]
   /li

これにより、値が「Neo」の属性を持つ子を持つ最初liの直後に続くすべてが選択されます。h2spanid

2番目のそのようなのqoutatationsを選択するh2には、上記の式1を。に置き換えるだけ2です。

すべての番号に対してこれを行います。1,2, ..., count(//h2[span/@id='Neo'])

XSLTベースの検証

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select=
   "(//h2[span/@id='Neo'])[1]/following-sibling::ul
      [count(.
            |
             (//h2[span/@id='Neo'])[1]
                /following-sibling::h2[1]
                  /preceding-sibling::ul
             )
      =
       count((//h2[span/@id='Neo'])[1]
                /following-sibling::h2[1]
                  /preceding-sibling::ul
             )
      ]
        /li

   "/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<html>
 <h2><span class="mw-headline" id="Neo">Neo</span></h2>

 <ul>
  <li> First quote </li>
 </ul>

 <ul>
  <li> Second quote </li>
 </ul>

 <h2><span class="mw-headline" id="dont wanna this">Useless</span></h2>  >
</html>

XPath式が評価され、選択したノードが出力にコピーされます。

<li> First quote </li>
<li> Second quote </li>

説明

これは、2つのノードセットの共通部分のKayessian(Dr. Michael Kayによる)式から得られます。

$ns1[count(.|$ns2) = count($ns2)]

$ns上記は、ノードセットとノードセットの両方に属するすべてのノードを正確に選択します$ns2

したがって、関心のある後続のすべての兄弟で$ns1構成されるノードセットに置き換えます。対象の兄弟の直後(最初)の兄弟である、の先行するすべての兄弟で構成されるノードセットに置き換えます。ulh2$ns2ulh2h2

これらの2つのノードセットの共通部分には、必要なすべてのul要素が含まれています。


更新:コメントの中で、OPは、最初のセクションからの結果を望んでいることだけを知っていると述べています。文字列「Neo」は不明です。

これが修正された解決策です:

(//h2[span/@id=$vSectionId])[1]
            /following-sibling::ul
  [count(.
        |
         (//h2[span/@id=$vSectionId])[1]
            /following-sibling::h2[1]
              /preceding-sibling::ul
         )
  =
   count((//h2[span/@id=$vSectionId])[1]
            /following-sibling::h2[1]
              /preceding-sibling::ul
         )
  ]
    /li

変数$vSectionIdは、次のXPath式の文字列値として取得する必要があります。

  substring(//div[h2='Contents']
              /following-sibling::ul[1]
                 /li[1]/a/@href,
            2)

ここでは、最初の目次エントリのから必要なものを取得し、最初の文字「#」をスキップしていidます。hrefa

これもXSLTベースの検証です:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vSectionId" select=
 "substring(//div[h2='Contents']
                      /following-sibling::ul[1]
                         /li[1]/a/@href,
                    2)
 "/>

 <xsl:template match="/">
  <xsl:copy-of select=
   "(//h2[span/@id=$vSectionId])[1]
                /following-sibling::ul
      [count(.
            |
             (//h2[span/@id=$vSectionId])[1]
                /following-sibling::h2[1]
                  /preceding-sibling::ul
             )
      =
       count((//h2[span/@id=$vSectionId])[1]
                /following-sibling::h2[1]
                  /preceding-sibling::ul
             )
      ]
        /li

   "/>
 </xsl:template>
</xsl:stylesheet>

この変換が http://en.wikiquote.org/wiki/The_Matrixにある完全なXMLドキュメントに適用されると、これら2つのXPath式を適用した結果(最初の結果を2番目の結果に置き換えてから、 2番目の式)は必要な正しいものです:

<li>I know you're out there. I can feel you now. I know that you're afraid. You're afraid of us. You're afraid of change. I don't know the future. I didn't come here to tell you how this is going to end. I came here to tell you how it's going to begin. I'm going to hang up this phone, and then I'm going to show these people what you don't want them to see. I'm going to show them a world … without you. A world without rules and controls, without borders or boundaries; a world where anything is possible. Where we go from there is a choice I leave to you.</li>
<li>Whoa.</li>
<li>I know kung-fu.</li>
<li>Yeah. Well, that sounds like a pretty good deal. But I think I may have a better one. How about, I give you the finger [He does] and you give me my phone call.</li>
<li>Guns.. lots of guns...</li>
<li>There is no spoon.</li>
<li>My name...is Neo!</li>
于 2012-12-16T20:38:31.087 に答える
2

APIを使用すると、解析が非常に簡単になります。最初のセクションをプルするクエリは次のとおりです。

http://en.wikiquote.org/w/api.php?action=parse&page=The_Matrix§ion=1&prop=wikitext

出力:

<?xml version="1.0"?>
<api>
  <parse title="The Matrix">
    <wikitext xml:space="preserve">== Neo ==
[[File:The.Matrix.glmatrix.2.png|thumb|right|Unfortunately, no one can be ''told'' what The Matrix is. You have to see it for yourself.]]
[[Image:Arty spoon.jpg|thumb|right|Do not try to bend the spoon — that's impossible. Instead, only try to realize the truth: there is no spoon.]]

* I know you're out there. I can feel you now. I know that you're afraid. You're afraid of us. You're afraid of change. I don't know the future. I didn't come here to tell you how this is going to end. I came here to tell you how it's going to begin. I'm going to hang up this phone, and then I'm going to show these people what you don't want them to see. I'm going to show them a world … without you. A world without rules and controls, without borders or boundaries; a world where anything is possible. Where we go from there is a choice I leave to you.

* Whoa.
* I know kung-fu.

* Yeah. Well, that sounds like a pretty good deal. But I think I may have a better one. How about, I give you the finger [He does] and you give me my phone call.

* Guns.. lots of guns...

* There is no spoon. 

* My name...is Neo!</wikitext>
  </parse>
</api>

これを解析する1つの方法は次のとおりです(HTTPartyを使用)。

require 'httparty'

class Wikiquote
  include HTTParty
  base_uri 'en.wikiquote.org/w/'

  def self.get_quotes(page)
    url = "/api.php?action=parse&page=#{page}&section=1&prop=wikitext&format=xml"
    headers = {"User-Agent" => "Wikiquote scraper 1.0"}
    content = get(url, headers: headers)['api']['parse']['wikitext']['__content__']
    return content.scan(/^\* (.*)$/).flatten
  end
end

使用法:

Wikiquote.get_quotes("The_Matrix")

出力:

["I know you're out there. I can feel you now. I know that you're afraid. You're afraid of us. You're afraid of change. I don't know the future. I didn't come here to tell you how this is going to end. I came here to tell you how it's going to begin. I'm going to hang up this phone, and then I'm going to show these people what you don't want them to see. I'm going to show them a world … without you. A world without rules and controls, without borders or boundaries; a world where anything is possible. Where we go from there is a choice I leave to you.",
 "Whoa.",
 "I know kung-fu.",
 "Yeah. Well, that sounds like a pretty good deal. But I think I may have a better one. How about, I give you the finger [He does] and you give me my phone call.",
 "Guns.. lots of guns...",
 "There is no spoon. ",
 "My name...is Neo!"]
于 2012-12-18T23:53:54.027 に答える
1

私は提案し//ul[preceding-sibling::h2[1][span/@id = 'Neo']]/liます。またはid、検索に関連しない属性もそれぞれ存在しない場合は、コメントの回答に基づいて、あなたが望むと思います

(//h2[span[contains(@class, 'mw-headline')]])[1]/following-sibling::ul
   [1 = count(preceding-sibling::h2[1] | (//h2[span[contains(@class, 'mw-headline')]])[1])]/li

XPath 軸を参照し、説明が表示されるまで次のすべてのノードを取得します。すべての大かっこと中かっこを正しく閉じることができたことを願っています。今はテストする時間がありません。

于 2012-12-16T17:14:33.563 に答える