【问题标题】:Working with Scrapy 'regex definition'使用 Scrapy 的“正则表达式定义”
【发布时间】:2016-05-02 19:27:49
【问题描述】:

我一直在尝试生成一个脚本来从网站https://services.aamc.org/msar/home#null 中抓取数据。我生成了一个 python scrapy 2.7 脚本来从网站上获取一段文本(我现在的目标是任何东西),但似乎无法让它工作。我怀疑这是因为我没有正确配置我的正则表达式来识别我试图从中刮取的跨度标签。有谁知道我可能做错了什么以及如何解决它?

非常感谢。

马特


import urllib
import re

url = "https://services.aamc.org/msar/home#null"
htmlfile = urllib.urlopen(url)
htmltext = htmlfile.read()
regex = '<td colspan="2" class="schoolLocation">(.+?)</td>'
pattern = re.compile(regex)
price = re.findall(pattern, htmltext)
print "the school location is ",price

【问题讨论】:

  • 你真的在使用 Scrapy 网页抓取框架吗?
  • 您可以使用scrapy shell 测试您的爬虫,另外考虑使用BeautifulSoup
  • @Jan 我认为这个问题是错误的,看起来 OP 没有使用 Scrapy 或 BeautifulSoup。

标签: regex python-2.7 scrapy


【解决方案1】:

首先,don't use regular expressions to parse HTML。有称为 HTML 解析器的专用工具,例如 BeautifulSouplxml.html

实际上,该建议与这个特定问题无关,因为不需要解析 HTML。 此页面上的搜索结果是从一个单独的端点动态加载的. urllib 不是浏览器,它只为您提供带有空搜索结果容器的初始页面 HTML。

您需要做的是在您的代码中模拟 XHR 请求。让我们使用requests 包。完整的工作代码,打印学校课程列表:

import requests


url = "https://services.aamc.org/msar/home#null"
search_url = "https://services.aamc.org/msar/search/resultData"

with requests.Session() as session:
    session.get(url)  # visit main page

    # search
    data = {
        "start": "0",
        "limit": "40",
        "sort": "",
        "dir": "",
        "newSearch": "true",
        "msarYear": ""
    }
    response = session.post(search_url, data=data)

    # extract search results
    results = response.json()["searchResults"]["rows"]
    for result in results:
        print(result["schoolProgramName"])

打印:

Albany Medical College
Albert Einstein College of Medicine
Baylor College of Medicine
...
Howard University College of Medicine
Howard University College of Medicine Joint Degree Program
Icahn School of Medicine at Mount Sinai

【讨论】:

  • 这太好了,谢谢。我也可以看到您在源代码中查找数据的位置,并且我可以看到您可以将 print(result["xxxx"]) 更改为您希望在数据中使用的任何变量。几个问题:您是如何找到 search_url 的? “data = {...} 控制什么?(特别是“sort”“dir”“newsearch”和“msarYear”?非常感谢。Matt
  • @MattGrossman 当然,请看看答案是否值得接受。谢谢。
  • 希望我做对了。刚开始作为这个网站的用户。你也能回答这些问题吗?
  • @MattGrossman 当然,我已经使用浏览器开发工具并检查了在加载搜索结果时正在进行的请求。 data 只是复制请求发布参数。希望对您有所帮助。
  • 不太明白这一点,但我还是个新手。非常感谢你的帮忙!我会试着从这里弄清楚其余的......
猜你喜欢
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 2018-09-20
  • 2015-12-18
  • 1970-01-01
  • 2013-11-18
  • 2013-01-18
  • 2015-03-11
相关资源
最近更新 更多