首页 > 解决方案 > Python 使用 xpath 从 HTML 中提取内容

问题描述

我正在尝试从此 HTML https://republic.co/1821-drinks中提取公司名称18.21 Drinks。我能够成功地将内容下载为 HTML 并在浏览器上本地打开文件并进行验证。

下面是我的代码:

    import lxml.html
    # The HTML Content is available as String in crawlOutput variable
    htmlDocument = lxml.html.fromstring(crawlOutput)
    print ( htmlDocument.xpath("/html/body/div[2]/div[2]/div/div[1]/div/div/div/header/div/div[2]/div[1]/div/div[1]/div[2]/h1"))
    print ( htmlDocument.xpath("/html/body/div[2]/div[2]/div/div[1]/div/div/div/header/div/div[2]/div[1]/div/div[1]/div[2]/h1/text()"))
    print ( htmlDocument.xpath('/html/body/div[2]/div[2]/div/div[1]/div/div/div/header/div/div[2]/div[1]/div/div[1]/div[2]/h1'))
    print ( htmlDocument.xpath('/html/body/div[2]/div[2]/div/div[1]/div/div/div/header/div/div[2]/div[1]/div/div[1]/div[2]/h1/text()'))
   
    print(htmlDocument.xpath("//h1[@class='c-primaryTitle offerings-show-header-title__company-name']/text()"))

输出

[]
[]
[]
[]
['\n18.21 Drinks\n']

请帮助我在哪里出错 xpath ?

标签: python-3.x

解决方案


目前尚不清楚“提取公司名称 18.21 Drinks”是什么意思。

无论如何,您的直接问题是您应该将字符串传递给 xpath 函数。将路径用引号括起来:

print ( htmlDocument.xpath('/html/body/div[2]/div[2]/div/div[1]/div/div/div/header/div/div[2]/div[1]/div/div[1]/div[2]/h1'))
print ( htmlDocument.xpath('/html/body/div[2]/div[2]/div/div[1]/div/div/div/header/div/div[2]/div[1]/div/div[1]/div[2]/h1/text()'))

不是答案的一部分,但考虑使用元素的类名而不是使用 xpaths 来获取值。这将使代码更容易理解。

print ( htmlDocument.xpath("//h1[@class='c-primaryTitle offerings-show-header-title__company-name']/text()"))

推荐阅读