使用 xpath 从 link 标签中提取 hyperlink

Extracting the hyperlink from link tag using xpath

将 html 视为

<item>
<title>this is the title</title>
<link>www.linktoawebsite.com</link>
</item>

我正在使用 Lxml(python) 和 Xpath 并尝试提取标题标签和 link 标签的内容。 密码是

page=urllib.urlopen(url).read()
x=etree.HTML(page)
titles=x.xpath('//item/title/text()')
links=x.xpath('//item/link/text()')

但这返回的是一个空列表。但是,这将返回一个 link 元素。

links=x.xpath('//item/link')        #returns <Element link at 0xb6b0ae0c>

谁能建议如何从 link 标签中提取网址?

通过 etree 解析内容,<link> 标签被关闭。因此 link 标签

没有文本值

演示:

>>> from lxml import etree
>>> content = """<item>
... <title>this is the title</title>
... <link>www.linktoawebsite.com</link>
... </item>"""
>>> x = etree.HTML(content)
>>> etree.tostring(x)
'<html><body><item>\n<title>this is the title</title>\n<link/>www.linktoawebsite.com\n</item></body></html>'
>>> 

根据 HTML,这不是有效标签。

我认为 link 标签结构是这样的:

<head>
<link rel="stylesheet" type="text/css" href="theme.css">
</head> 

您为这项工作使用了错误的解析器;你没有 HTML,你有 XML.

正确的 HTML 解析器将忽略 <link> 标记的内容,因为在 HTML 规范中该标记始终为空。

使用 etree.parse() 函数解析您的 URL 流(不需要单独的 .read() 调用):

response = urllib.urlopen(url)
tree = etree.parse(response)

titles = tree.xpath('//item/title/text()')
links = tree.xpath('//item/link/text()')

您也可以使用 etree.fromstring(page),但将读取留给解析器会更容易。