Как выполнить поиск на странице HTML для элемента в данном списке

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

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 ответов

Решение

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

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

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

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

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

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

Майк

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

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

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 для такого рода вещей, потому что встроенный администратор базы данных позволяет легко добавлять известные варианты.

Вы должны рассмотреть возможность использования 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

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], Так как школы и даты идут по одной линии. Любые предложения, как я могу это сделать? Благодарю.

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

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

    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

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

Благодарю.

Другие вопросы по тегам