Проблема с пиапарсингом - чистка сайта без использования тегов HTML - PullRequest
3 голосов
/ 23 февраля 2012

Я пытаюсь использовать pyparsing для анализа информации с веб-сайта, однако все примеры, которые я нахожу, в основном используют теги HTML для идентификации различных фрагментов текста.

Например, ниже трудно разделить с помощью HTML-тегов (программа не работает с этим сайтом). Как я могу разделить авторов, заголовок и т. Д.

import urllib

from pyparsing import *

paraStart,paraEnd = makeHTMLTags("p")

# read HTML from a web page
serverListPage = urllib.urlopen( "http://www.cs.cf.ac.uk/contactsandpeople/allpubs.php?emailname=C.L.Mumford" )
htmlText = serverListPage.read()
serverListPage.close()

para = paraStart + SkipTo(paraEnd).setResultsName("body") + paraEnd


for tokens,start,end in para.scanString(htmlText):
    print tokens.body,'->',tokens.href

Я относительно новичок в pyparsing и просмотрел книги и Интернет для примеров этого. Любая помощь приветствуется. Спасибо.

РЕДАКТИРОВАТЬ: Когда я запускаю программу, я получаю следующее: перейти к содержанию Перейти к меню навигации

Однако, если я перехожу на поиск с ("p") на ("li") другого сайта, он извлекает информацию из блока.

1 Ответ

3 голосов
/ 24 февраля 2012

Вы должны знать намного больше о содержимом веб-страницы, с которой вы копируете данные. Если вы просто слепо бросаете парсеры tag-tagend на странице, вы просто получите случайные куски текста.

Попробуйте распечатать всю страницу HTML (которую ваш скрипт записывает в переменную htmlText), затем начните искать в тексте шаблоны, которые укажут на интересующие вас данные. Эти данные могут быть частью шаблон, это нормально. Биты текста внутри <> s являются тегами HTML - причина, по которой при разборе текста включается метод makeHTMLTags, состоит в том, что структура текста внутри тега может варьироваться в диком виде , с необязательными и неожиданными атрибутами, или атрибуты в неожиданном порядке, или с неожиданным верхним / нижним регистром, или с неожиданным пробелом - makeHTMLTags покрывает все эти вещи, поэтому большинство веб-скребков, написанных с использованием pyparsing, используют этот метод для определения шаблона, который получает интересные данные. 1009 *

Попробуйте этот процесс: распечатайте htmlText на бумаге. Используйте синий маркер, чтобы выделить данные, которые вы хотите. Затем используйте желтый маркер, который идентифицирует окружающие данные или теги, которые помогут найти эти данные. Теперь у вас есть шаблон для создания выражения pyparsing для извлечения этих данных. Вы уже начали использовать имя результатов (определение 'body' в вашем парсере) - это хорошая привычка, так держать. Пометьте все выражения для синего текста именами результатов, чтобы после сопоставления общего шаблона вы могли просто получить отдельные биты, используя имена.

Удачи!

...