Википедия, игровая диаграмма философии на python и R


Итак, я относительно новичок в python, и для того, чтобы научиться чему-то, я начал писать программу, которая переходит в Википедию, находит первую ссылку в обзорном разделе случайной статьи, переходит по этой ссылке и продолжает до тех пор, пока она не появится. либо входит в цикл, либо находит страницу философии (как подробно описано здесь ), а затем повторяет этот процесс для новой случайной статьи указанное количество раз. Затем я хочу собрать результаты в виде некоторой полезной структуры данных, чтобы я мог передать данные в R с помощью библиотеки Rpy , чтобы я мог нарисовать какую-то сетевую диаграмму (R довольно хорошо умеет рисование таких вещей) с каждым узлом на диаграмме, представляющим посещенные страницы, и стрелками, ведущими от начальной статьи к странице философии.

Таким образом, у меня нет проблем с тем, чтобы python возвращал достаточно структурированный html из вики, но есть некоторые проблемы, которые я не могу понять. До сих пор я выбирал первую ссылку, используя cssselector из библиотеки lxml. Он выбирает первую ссылку (в теге), которая является прямым потомком тега ap, который является прямым потомком тега div с class = "mw-content-ltr" следующим образом:

    user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT)'
    values = {'name' : 'David Kavanagh',
      'location' : 'Belfast',
      'language' : 'Python' }
    headers = { 'User-Agent' : user_agent }
    encodes = urllib.urlencode(values)
    req = urllib2.Request(url, encodes, headers)
    page = urllib2.urlopen(req)
    root = parse(page).getroot()
    return root.cssselect("div.mw-content-ltr>p>a")[0].get('href')

Этот код находится в функция, которую я использую, чтобы найти первую ссылку на странице. Это работает по большей части, но проблема в том, что если первая ссылка находится внутри какого-то другого тега, а не является прямым потомком тега p, например, допустим, тег b или что-то в этом роде, я пропустил это.Как видно из вики-статьи выше, ссылки, выделенные курсивом или внутри круглых скобок, не подходят для игры, что означает, что я никогда не получаю ссылку, выделенную курсивом (хорошо), но часто получаю ссылки, заключенные в круглые скобки (плохо) и иногда пропускают первую ссылку на странице, например, первую ссылку в статье «Стул», которая является табуреткой, но она выделена жирным шрифтом, поэтому я ее не понимаю. Я попытался удалить условие прямого потомка, но затем я часто получаю ссылки, которые находятся «над» разделом обзора, которые обычно находятся в боковом поле, в теге p, в таблице, в том же div, что и раздел обзора.

Итак, первая часть моего вопроса:

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

Итак, в настоящее время я храню результаты в списке списков. Итак, у меня есть список, называемый путями, в котором есть списки, содержащие строки, содержащие заголовок статьи вики.

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

Мы будем благодарны за любые идеи или предложения.
Ура,
Дэви

5
задан alain.janinm 28 April 2012 в 21:18
поделиться