【问题标题】:How to open "partial" links using Python?如何使用 Python 打开“部分”链接?
【发布时间】:2019-12-18 10:50:27
【问题描述】:

我正在开发一个 webscraper,它可以打开一个网页,并打印该网页中的任何链接如果链接包含关键字(我稍后会打开这些链接以进行进一步的抓取)。

例如,我正在使用请求模块打开“cnn.com”,然后尝试解析该网页中的所有 href/链接。然后,如果任何链接包含特定单词(例如“china”),Python 应该打印该链接。

我可以简单地使用请求打开主页,将所有 href 保存到列表(“链接”)中,然后使用:

links = [...]

keyword = "china"

for link in links:
   if keyword in link:
      print(link)

但是,这种方法的问题是我最初解析出来的链接不是完整的链接。例如,所有与 CNBC 网页的链接都是这样的结构:

href="https://www.cnbc.com/2019/08/11/how-recession-affects-tech-industry.html"

但是对于 CNN 的页面,它们是这样写的(不是完整的链接……它们缺少“/”之前的部分):

href="/2019/08/10/europe/luxembourg-france-amsterdam-tornado-intl/index.html"

这是一个问题,因为我正在编写更多脚本来自动打开这些链接来解析它们。但是Python打不开

"/2019/08/10/europe/luxembourg-france-amsterdam-tornado-intl/index.html"

因为它不是一个完整的链接。

那么,什么是强大的解决方案(也适用于其他网站,而不仅仅是 CNN)?

编辑:我知道我在这篇文章中作为示例写的链接不包含“中国”一词,但这只是示例。

【问题讨论】:

  • 添加域? "https://www.cnn.com" + href。如果域是动态的,请使用变量。
  • @TrebledJ 我正在考虑这样做,但我有 50 个不同的“新闻网站”,所以我不能简单地将“cnn.com”添加到所有网站上。我想知道 Python 是否有办法自动将正确的链接添加到 href 中?
  • 如果没有您正在使用的刮板的最小示例,很难说...我假设要刮掉一个您将调用函数的网站?或者实例化一个新的类实例?将域作为另一个参数传递,如果链接是部分链接,则添加域。
  • IIRC scrapy 没有这个问题。它们具有自动跟随链接的功能。可能值得学习。
  • Hiw 轻松制作绝对链接:stackoverflow.com/questions/44001007/…

标签: python-3.x parsing web-scraping hyperlink href


【解决方案1】:

尝试使用urllib.parse 包中的urljoin 函数。它有两个参数,第一个是您当前正在解析的页面的 URL,它作为相对链接的基础,第二个是您找到的链接。如果您找到的链接以http://https:// 开头,它将只返回该链接,否则它将解析相对于您作为第一个参数传递的 URL。

例如:

#!/usr/bin/env python3

from urllib.parse import urljoin

print(
  urljoin(
    "https://www.cnbc.com/",
    "/2019/08/10/europe/luxembourg-france-amsterdam-tornado-intl/index.html"
  )
)
# prints "https://www.cnbc.com/2019/08/10/europe/luxembourg-france-amsterdam-tornado-intl/index.html"

print(
  urljoin(
    "https://www.cnbc.com/",
    "http://some-other.website/"
  )
)
# prints "http://some-other.website/"

【讨论】:

  • 比我提出的 janky 代码更好的解决方案!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多