Как выполнить поиск на странице HTML для элемента в данном списке - PullRequest
0 голосов
/ 29 ноября 2009

У меня есть список школ

schools = ['Harvard Law School', 'Stanford Law School', 'Yale Law School', 'Columbia Law School', 'NYU School of Law', 'University of Chicago Law School']

и биографии юристов, которые содержат одну из этих школ:

html = "page that contains one of these schools" 

как это

"<strong><em>Education</em></strong><br />JD, Columbia Law School, Harlan Fiske Stone Scholar, Parker School Recognition of Achievement in International and Foreign Law, 2005<br />BM, BM, University of Michigan - Ann Arbor, <EM>summa cum laude</EM>, 1997<br />"

Я извлекал информацию о школе с помощью регулярных выражений. Но я подумал, что было бы лучше иметь список поиска школ и искать на каждой странице соответствующую школу. Я новичок в Python, поэтому я искал, как это сделать, и нашел difflib.SequenceMatcher .

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

Спасибо!

Ответы [ 6 ]

1 голос
/ 29 ноября 2009

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

schools = []
html = page.read()
for school in list:
    if school in html:
        schools.append(school)

Причина в следующем: вы предполагаете, что названия юридических школ представлены на веб-сайтах адвокатов единообразно, но это предположение не является надежным. Например, я ходил в юридическую школу под названием Калифорнийский университет, юридический колледж Гастингса. Иногда он появляется на сайтах адвокатов как юридический колледж Гастингса, а другие - как UC Hastings. Часто данные о том, куда адвокат ходил в школу, собираются непосредственно от адвоката, поэтому они будут отображаться дословно, как он или она их предоставили. Вы, вероятно, не можете предположить, что данные были позже нормализованы.

В результате любые названия школ, которые отклоняются от вашего списка поиска, не будут найдены. Чтобы еще больше усложнить ситуацию, самая короткая версия названия моей школы - UC Hastings - может даже привести к путанице в difflib «получить близкие совпадения», если вы не установите соотношение совпадений очень низкое, что неизбежно приводит к тому, что подпрограмма находит ряд других ложных положительные тоже.

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

difflib.get_close_matches

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

1 голос
/ 29 ноября 2009

Это очень простой способ очистки экрана для достижения того, чего вы хотите

import urllib
html = urllib.urlopen(pageToLawyersBio)

htmlstr=''
for line in html.readlines():
    htmlstr += line.lower()

for school in listOfSchools:
    if school.lower() in htmlstr:
        print "This lawyer went to", school
1 голос
/ 29 ноября 2009

Я ничего не знаю о Python, но я часто создаю динамические выражения регулярных выражений в виде строки:

"(школа 1 | школа 2 | школа 3 | школа n)"

Затем я создаю экземпляр объекта регулярного выражения, передавая строку.

После этого вы можете сопоставить свои школы независимо от формы документа, если только HTML-тег не находится в середине названия школы.

Mike

РЕДАКТИРОВАТЬ - пример (извините, c #): "(" + String.Join("|", arrayOfSchools) + ")"

0 голосов
/ 29 ноября 2009

inspectorG4dgt: Это здорово! Благодарю. Я думаю, что это лучше, чем с помощью регулярных выражений. Потому что на некоторых страницах «JD» стоит перед названием школы, на других - после названия школы. То же самое с датами выпуска.

Я пытался найти линию, где встречаются названия школ, но я не смог этого сделать. Примерно так:

htmlstr = ''
for line in html.readlines():
    htmlstr += line.lower()

for school in listOfSchools:
    if school.lower() in htmlstr:
        [ schoolLine = line with the school and date ]

Чтобы узнать больше об этом материале, я изучал этот учебник .

Например, я пытался использовать readline() для цикла в каждой строке, но это не сработало.

Или лучше поискать listOfSchools и список years = [1956, ... 2008]. Так как школы и даты идут по одной линии. Любые предложения, как я могу это сделать? Спасибо.

0 голосов
/ 29 ноября 2009

Вы должны рассмотреть возможность использования beautifulSoup для разбора HTML. Что касается вашего вопроса, вы можете попробовать что-то вроде:

for line in html.split("<br \>"):
    # This gives a lot of crap, filter it with
    for values in line.split(", "):
         try: 
             if values[0] in schools:
                  #This line contains a school, write it out.
         except:
             # Ignore badly formatted lines
             pass
0 голосов
/ 29 ноября 2009

Мне нужно знать, какая школа соответствует.

Теперь я извлекаю информацию о школе с помощью регулярных выражений (я все еще тестирую):

    item = re.search('(JD)(.*?)(\d+)', html)
    if item:
        JD = item.group()
        f = open('test1.txt', 'a')
        f.write(JD)
    else:
        NoJD = ("empty cvs schema goes here")
        f = open('test1.txt', 'a')
        f.write(NoJD) 

Это берет соответствующую часть из HTML:

JD, Columbia Law School, Harlan Fiske Stone Scholar, Parker School Recognition of Achievement in International and Foreign Law, 2005

Мне все еще нужно разобрать это для правильного форматирования, чтобы я мог записать его в файл items.csv:

first,initial,last,title,firm,school,year

Итак, я подумал, что если бы я искал совпадения для школ, я мог бы подобрать названия школ (и год выпуска), просмотрев список школ. Но если это будет слишком сложно, я перейду к регулярному выражению.

Спасибо.

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