如何在HTML页面中搜索给定列表中的项目

时间:2009-11-28 22:06:48

标签: python

我有一份学校名单

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 个答案:

答案 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()循环每一行,但这不起作用。

或者搜索listOfSchoolsyears = [1956, ... 2008]列表可能会更好。由于学校和日期是相同的。有什么建议我怎么做?感谢。