2016-08-21 75 views
0

我正在嘗試編寫一個小應用程序來從Wikipedia頁面提取內容。當我第一次想到它時,我認爲我可以將包含XPath內容的div作爲目標,但在瞭解維基百科如何構建其文章之後,我很快發現並不那麼容易。在獲取頁面時分離內容的最佳方式是選擇兩組h2標籤之間的內容。XPath在兩個標題之間獲取標記

例子: <h2>Title</h2> <div>Some Content</div> <h2>Title</h2>

在這裏,我會想套頭之間的div。我試着用XPath來做這件事,但沒有成功。我將更深入地研究XPath,因爲我認爲這是我需要用來實現我想要的,但是在我深入研究之前,我想聽聽你們對此有何看法。 XPath是否正確或者我有其他更簡單的選擇?我用C#編寫應用程序,如果這有什麼區別的話。

回答

2

是的,您正處於XPath的正確軌道 - 它非常適合選擇XML文檔的各個部分。

例如,對於這個XML,

<r> 
    <h2>Title A</h2> 
    <div>Some Content</div> 
    <div>More Content</div> 
    <h2>Title B</h2> 
</r> 

這個XPath,

//div[preceding-sibling::h2 = 'Title A' and following-sibling::h2 = 'Title B'] 

將選擇這個內容,

<div>Some Content</div> 
<div>More Content</div> 

兩個h2冠軍之間,按要求。


更新,以解決OP的自我回答:

對於這個新的XML例子,

<div> 
    <h2><span>Summary</span></h2> 
    <p>Paragraph</p> 
    <ul> 
     <li>List1</li> 
     <li>List2</li> 
     <li>List3</li> 
    </ul> 
    <p>Paragraph</p> 

    <h2><span>Location</span></h2> 
    <p>Paragraph</p> 
</div> 

我上面提供的XPath的可以很容易地適應,

//*[preceding-sibling::h2 = 'Summary' and following-sibling::h2 = 'Location'] 

選擇此XML,

<p>Paragraph</p> 
<ul> 
    <li>List1</li> 
    <li>List2</li> 
    <li>List3</li> 
</ul>  
<p>Paragraph</p> 

根據要求。

+1

這是正是我正在尋找的!謝謝:-)在我回家測試後,我會標記爲正確答案。 – SeverinDK

+0

我在自己的答案中添加了正確的答案。儘管你的回答確實指引着我朝着正確的方向前進! – SeverinDK

+0

不客氣。如果有幫助,請[**接受**](http://meta.stackoverflow.com/q/5234/234215)這個答案。謝謝。 (不知道你的意思是什麼*我添加了我自己的答案正確的答案*,除非你的意思是你必須作出調整 - 我沒有看到另一個SO答案在這裏發佈到你這個問題。) – kjhughes

0

在kjhughes的建議幫助下,我設法讓代碼工作。

我無法使= 'Text'部分工作,但[text() = 'text']

這僅僅是不夠的,因爲我需要的內容的標題是在h2標籤的span內的位置替換它,所以我必須更多地調整XPath。

這是我想出了:

//*[preceding-sibling::h2::following-sibling::span[text() = 'Summary'] and following-sibling::h2::following-sibling::span[text() = 'Location']] 

我測試了這個HTML使用http://www.xpathtester.com/xpath

<div> 
    <h2><span>Summary</span></h2> 
    <p>Paragraph</p> 
    <ul> 
     <li>List1</li> 
     <li>List2</li> 
     <li>List3</li> 
    </ul> 
    <p>Paragraph</p> 

    <h2><span>Location</span></h2> 
    <p>Paragraph</p> 
</div> 

這給了我下面的結果:

<p>Paragraph</p> 
<ul> 
    <li>List1</li> 
    <li>List2</li> 
    <li>List3</li> 
</ul> 
<p>Paragraph</p>