【问题标题】:Python parsing html for complete links urlsPython解析html以获得完整的链接url
【发布时间】:2015-02-08 11:15:57
【问题描述】:

我必须解析一个 html 页面来寻找其中的链接。不幸的是,这些链接不包含完整的 url(例如以“http://www.example.com/aResource.html”开头)。所以我的解析只得到相对 URL,以获得我正在使用的整个 url 地址

urlparse.urljoin()

但它通常会导致一些连接错误,通常我更喜欢直接提取完整 url 链接的方法。这是我的代码:

import urlparse
import requests
from lxml import html
from lxml import etree

aFile = requests.get(url)
tree = html.fromstring(aFile.text)

linkList = tree.xpath('//a')

urls = []

for link in linkList:
    urls.append(str(urlparse.urljoin(url,link.get('href'))))

如您所见,我正在使用 lxml,但我也尝试过使用 BeautifulSoup,但没有成功。

【问题讨论】:

标签: python hyperlink html-parsing


【解决方案1】:

由于<a href=""...> 中缺少信息(URL 方案、主机服务器、端口、路径 - 基本 URL),因此需要将其添加到相对 URL。

通常使用urlparse.urljoin() 是正确的,就像您已经在使用的那样。

HTML 确实允许使用<base href="..."> 标记为页面指定基本网址,该标记必须在<head> 中定义一次。如果存在此标记,您应该使用它的 href 属性作为urljoin() 的基本 URL。您的代码可以修改为:

import urlparse
import requests
from lxml import html
from lxml import etree

aFile = requests.get(url)
tree = html.fromstring(aFile.text)

linkList = tree.xpath('//a')

urls = []

try:
    base_url = tree.xpath('//base[1]/@href')[0]
except IndexError:
    base_url = url

for link in linkList:
    urls.append(str(urlparse.urljoin(base_url,link.get('href'))))

但是,如果您遇到连接错误,则显示某些链接无效。从页面 URL 或 <base href="..."> 标记派生的基本 URL 是正确的。使用此值构造的任何无效 URL 必须是由于无效的相对 URL(或无效的 <base> 标记)造成的。

您是否有遇到连接错误时使用的 URL 的具体示例?

你也可以看看mechanize:

import mechanize

br = mechanize.Browser()
resp = br.open(url)
urls = [link.absolute_url for link in br.links()]

【讨论】:

  • 出了什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 2013-10-25
  • 2018-12-13
  • 2013-07-22
  • 2016-09-07
相关资源
最近更新 更多