我有一份学校名单
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。
我一直在玩它,它很有趣,但我不认为它是我想要做的正确的工具。任何人都可以指导我这样做的正确方法吗?
谢谢!
答案 0 :(得分:1)
我对Python一无所知,但我经常在一个字符串中创建动态正则表达式:
“(学校1 |学校2 |学校3 |学校n)”
然后我实例化一个正则表达式对象,传递字符串。
然后,您可以匹配您的学校,无论文档的形式如何,除非HTML标记位于学校名称的中间。
麦克
编辑 - 示例(抱歉c#):"(" + String.Join("|", arrayOfSchools) + ")"
答案 1 :(得分:1)
这是一种非常基本的屏幕抓取方式,可以实现您的目标
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
答案 2 :(得分:1)
我讨厌在你的游行中下雨,但建立一个法学院的查找列表,然后在源代码中进行集合成员类型的测试可能不会起作用。有缺陷的方法:
schools = []
html = page.read()
for school in list:
if school in html:
schools.append(school)
原因是:您假设法学院的名字在律师网站上统一代表,但这种假设并不可靠。例如,我去了一所名为加州大学黑斯廷斯法学院的法学院。有时它出现在律师网站上作为黑斯廷斯法学院,而其他人则出现在UC Hastings。通常,关于律师上学地点的数据是直接从律师那里收集的,因此在他或她提供时会逐字逐句显示。您可能无法假设数据后来已标准化。
因此,将找不到偏离查询列表的任何学校名称。更复杂的是,我学校名称的最短版本 - UC Hastings - 甚至可能会混淆difflib'get close matches'查找,除非你将匹配率设置得很低,这不可避免地导致例程找到其他一些错误积极的。
这是我的建议。 Spider列出所有法学院名称并将其放入数据库表中。创建一个与列表中已知偏差的第二个表。每次捕获站点时,请在查找列表(或动态生成的正则表达式)中尝试基本集合成员资格测试。在这种查找失败的可能事件中,使脚本抛出错误并将不匹配的学校打印到控制台。将该学校添加到已知变体表中,并将其键入主查找表中的正确学校名称。重复此过程,直到您确信您已考虑大多数变体。从那里开始,使用
添加一个hack来检查正确的学校名称与官方查找项目和所有已知变体的列表difflib.get_close_matches
使用这种方法可以在找不到学校时返回最接近的有效匹配。它可能是您的客户可以要求的最好的。我使用django来做这种事情,因为内置的数据库管理员可以很容易地添加已知的变体。
答案 3 :(得分:0)
我需要知道哪所学校匹配。
现在我用正则表达式提取学校信息(我还在测试):
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
所以,我想如果我为学校寻找比赛,我可以通过查找学校名单来获取学校名称(和毕业年份)。但如果这太复杂了,我会继续使用正则表达式。
感谢。
答案 4 :(得分:0)
您应该考虑使用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
答案 5 :(得分:0)
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 ]
要了解有关此内容的更多信息,我一直在研究tutorial。
例如,我尝试使用readline()
循环每一行,但这不起作用。
或者搜索listOfSchools
和years = [1956, ... 2008]
列表可能会更好。由于学校和日期是相同的。有什么建议我怎么做?感谢。