如何从本身就是超链接的href中获取URL?

时间:2019-02-15 03:07:30

标签: python html xpath

我正在使用Python和lxml尝试抓取this html page。我遇到的问题是试图从此超链接文本“ Chapter02a”中获取URL。 (请注意,我似乎无法在此处使用链接格式)。

<li><a href="[Chapter02A](https://www.math.wisc.edu/~mstemper2/Math/Pinter/Chapter02A)">Examples of Operations</a></li>

我尝试过

//ol[@id="ProbList"]/li/a/@href

但这只会给我文字“ Chapter02a”。

也:

//ol[@id="ProbList"]/li/a

这将返回一个lxml.html.HtmlElement对象,并且我在文档中找到的所有属性都无法完成我想做的事情。

from lxml import html
import requests

chapter_req = requests.get('https://www.math.wisc.edu/~mstemper2/Math/Pinter/Chapter02')
chapter_html = html.fromstring(chapter_req.content)
sections = chapter_html.xpath('//ol[@id="ProbList"]/li/a/@href')
print(sections[0])

我希望 sections 是这些小节的URL列表。

2 个答案:

答案 0 :(得分:1)

您看到的回报是正确的,因为Chapter02a是指向下一部分的“相对”链接。完整网址未列出,因为它不是在html中存储的方式。

要获取完整的网址,您可以使用:

url_base = 'https://www.math.wisc.edu/~mstemper2/Math/Pinter/'
sections = chapter_html.xpath('//ol[@id="ProbList"]/li/a/@href')
section_urls = [url_base + s for s in sections]

答案 1 :(得分:1)

您也可以直接在XPATH级别进行串联,以从相对链接重新生成URL:

from lxml import html
import requests

chapter_req = requests.get('https://www.math.wisc.edu/~mstemper2/Math/Pinter/Chapter02')
chapter_html = html.fromstring(chapter_req.content)
sections = chapter_html.xpath('concat("https://www.math.wisc.edu/~mstemper2/Math/Pinter/",//ol[@id="ProbList"]/li/a/@href)')
print(sections)

输出:

https://www.math.wisc.edu/~mstemper2/Math/Pinter/Chapter02A