XPath в Википедии - PullRequest
       2

XPath в Википедии

0 голосов
/ 15 ноября 2011

В настоящее время я пытаюсь извлечь объявление или резюме из любой страницы Википедии, используя XPath.Сейчас в Интернете есть много мест, где это уже было сделано: http://jimblackler.net/blog/?p=13, Как использовать XPath или xgrep для поиска информации в Википедии? .

Но когда я пытаюсьиспользование похожих выражений XPath на разных страницах приводит к странным результатам.Ради этого вопроса, давайте предположим, что я пытаюсь получить самый первый абзац на печатной странице Википедии в Бостоне: http://en.wikipedia.org/w/index.php?title=Boston&printable=yes.

Когда я пытаюсь использовать это выражение /html/body/div[@id='content']/div[@id='bodyContent']//p, только последнийвозвращаются четыре слова абзаца «в Соединенных Штатах».

На самом деле вышеприведенное выражение можно упростить до //div/p, но результаты будут такими же.

Как ни странно, ссылки, на которые я ссылался ранее, похоже, используют похожие методы и дают отличные результаты;Первоначально я предполагал, что это произошло из-за того, что Википедия изменила форматирование своих страниц в последние годы, но, честно говоря, я не могу найти, что не так с обоими выражениями.

1 Ответ

0 голосов
/ 15 ноября 2011

Когда я пытаюсь использовать это выражение /html/body/div[@id='content']/div[@id='bodyContent']//p, возвращаются только последние четыре слова абзаца "в Соединенных Штатах".

Тамздесь есть несколько проблем :

  1. XML-документ находится в пространстве имен по умолчанию .Написание выражений XPath для выбора узлов в документе, который находится в пространстве имен по умолчанию, является наиболее часто задаваемым вопросом о XPath - ищите «XPath и пространство имен по умолчанию».Короче говоря, любое имя без префикса, скорее всего, не будет ничего выбирать.Необходимо зарегистрировать пространство имен по умолчанию и связать определенный префикс с этим пространством имен.Затем любое имя элемента в выражении XPath должно быть записано с этим префиксом.Таким образом, приведенное выше выражение станет следующим::
/x:html/x:body/x:div[@id='content']/x:div[@id='bodyContent']//x:p

, где префикс "x:" связан с пространством имен "http://www.w3.org/1999/xhtml".

.2, Даже вышеприведенное выражение не выбирает (только) нужный узел .Чтобы выбрать только первое x:p из вышеперечисленного, выражение XPath должно быть указано как (обратите внимание на квадратные скобки):

(/x:html/x:body/x:div[@id='content']/x:div[@id='bodyContent']//x:p)[1]

.3. Как вам нужно, текст абзаца , простой способ сделать это - использовать стандартную функцию XPath string():

string((/x:html/x:body/x:div[@id='content']/x:div[@id='bodyContent']//x:p)[1])

Когда вычисляется это выражение XPath, я получаю текст абзаца - например, в визуализаторе XPath, который я написал несколько лет назад:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...