2016-08-21 3 views
0

Я пытаюсь написать небольшое приложение для извлечения содержимого из страниц Википедии. Когда я впервые подумал, что это так, я подумал, что могу просто нацелить divs, содержащие контент с XPath, но после изучения того, как Wikipedia строит свои статьи, я быстро обнаружил, что это будет не так просто. Лучший способ разделить контент, когда я получаю страницу, - это выбрать, что находится между двумя наборами тегов 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 названиями, как просили.


Update для решения собственного ответа 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

Добро пожаловать. Пожалуйста, [** accept **] (http://meta.stackoverflow.com/q/5234/234215) этот ответ, если это поможет. Благодарю. (Не уверен, что вы подразумеваете под * Я добавил свой собственный ответ на правильный ответ *, если вы не имеете в виду, что вам нужно было внести коррективы - я не вижу другого ответа SO, размещенного здесь вами на этот вопрос.) – kjhughes

0

С помощью предложения kjhughes мне удалось заставить код работать.

я не смог сделать = 'Text' часть работы, но заменил его [text() = 'text']

Это само по себе было недостаточно, так как названия содержания, мне нужно это место внутри span в h2 тега, так что я пришлось адаптировать XPath немного больше.

Это то, что я придумал:

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

Я тестировал его с помощью http://www.xpathtester.com/xpath на этом HTML:

<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> 
Смежные вопросы