【问题标题】:How to extract information from single line text with no html class?如何从没有 html 类的单行文本中提取信息?
【发布时间】:2019-09-30 22:53:12
【问题描述】:

我正在尝试使用 scrapy 和 python 抓取我的第一个网站 (https://news.ycombinator.com/jobs)。我需要提取的信息如下: - 正在招聘的公司名称 - 公司所在地 - 广告的位置

页面 html 中这些字段没有单独的标签。文本没有特定的模式。 例如 ZeroCater (YC W11) 正在招聘 SF 的首席工程师:必须热爱美食

单独的正则表达式不足以提取此信息。有没有什么有效又简单的办法解决这个问题?

我已经尝试过 python 正则表达式。我还使用 nltk 研究了 NLP 和文本分类。但是nltk会增加代码的复杂度,而且比较耗时。

【问题讨论】:

  • 不明白,为什么正则表达式不足以提取。 ZeroCater 不是公司,SF 不是您给定示例中的位置吗?
  • 为了记录,HackerNews 有一个 API,你不必刮网站:github.com/HackerNews/API
  • 这个问题太笼统了,和网页抓取或scrapy无关。您想从非结构化文本中提取结构化数据。没有办法做到这一点,这将适合一个单一的答案。您需要一个智能的自然语言处理系统,该系统经过培训可以理解职称和位置。您应该查看nltk 包。或者,您可以只覆盖一些模式并提取 一些 数据,但当您解析的文本没有严格的结构时,您将无法获得高覆盖率。

标签: python regex web-scraping scrapy


【解决方案1】:

在这种情况下,我将尝试找到任何模式来帮助我提取这些数据, 例如,我可以看到这些词经常出现"is hiring|is looking for|is looking to hire|hiring",公司名称在前,位置在in 之后:

这只是一个小试验,你可以扩展它以获得你需要的东西

import re
text = """ZeroCater (YC W11) Is Hiring a Principal Engineer in SF: Must Love Food (zerocater.com)
OneSignal Is Hiring Full Stack Engineers in San Mateo (onesignal.com)
Faire (YC W17) Is Looking to Hire Business Operations Leads (greenhouse.io)
InsideSherpa (YC W19) Is Hiring Software Engineers in Sydney (workable.com)
Jerry (YC S17) Is Hiring Senior Software Dev, Data Engineer (Toronto/Remote) (getjerry.com)
Iris Automation Is Hiring an Account Executive for B2B Flying Vehicle Software (irisonboard.com)"""

data = text.lower().splitlines()

for i, line in enumerate(data):
    # getting company name
    data[i] = re.split(r'is hiring|is looking for|is looking to hire|hiring', line)

    # job title and location if present
    data[i][1] = re.split(r' in ', data[i][1])

print('company --- Job Title --- Location')
for c in data:
    print(f'{c[0]} --- {c[1][0]} --- {c[1][1] if len(c[1])>1 else ""}')

输出:

company --- Job Title --- Location
zerocater (yc w11)  ---  a principal engineer --- sf: must love food (zerocater.com)
onesignal  ---  full stack engineers --- san mateo (onesignal.com)
faire (yc w17)  ---  business operations leads (greenhouse.io) --- 
insidesherpa (yc w19)  ---  software engineers --- sydney (workable.com)
jerry (yc s17)  ---  senior software dev, data engineer (toronto/remote) (getjerry.com) --- 
iris automation  ---  an account executive for b2b flying vehicle software (irisonboard.com) --- 

确定这段代码需要大量修改才能获得可靠的结果,但至少是一个开始

【讨论】:

  • 感谢大家的帮助。我尝试了 spacy 和 ne-chunk 用于命名实体识别,但我无法从其中任何一个中获得正确的结果。最后我尝试了nltk和正则表达式的混合。我只使用 nltk 进行 pos 标记,并使用正则表达式进行模式匹配。结果现在好多了。仍然需要一些改进。我认为最好的解决方案是使用机器学习训练我自己的分类器。但显然这需要时间和努力。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 2017-04-24
  • 1970-01-01
  • 2011-09-14
  • 2012-01-22
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
相关资源
最近更新 更多