使用 xpath 从特定网站提取 HTML 标记内容

Extracting HTML tag content with xpath from a specific website

我正在尝试使用 lxml 提取网页上特定标签的内容,即 Indeed.com。

示例页面:link

我正在尝试提取公司名称和职位名称。 Chrome显示公司名称位于

"//*[@id='job-content']/tbody/tr/td[1]/div/span[1]"

职位名称位于

"//*[@id='job-content']/tbody/tr/td[1]/div/b/font"

这段代码试图从本地保存和解析的页面副本中提取这些值:

import lxml.html as h

xslt_root = h.parse("Temp/IndeedPosition.html")
company = xslt_root.xpath("//*[@id='job-content']/tbody/tr/td[1]/div/span[1]/text()")
position = xslt_root.xpath("//*[@id='job-content']/tbody/tr/td[1]/div/b/font/text()")
print(company)
print(position)

但是,打印命令 return 空字符串,意味着没有提取任何内容!

这是怎么回事?我使用了正确的标签吗?我不认为这些是动态生成的,因为页面在 javascript 禁用的情况下正常加载。

如果能帮助我提取这两个值,我将不胜感激。

与您的假设不同,页面上的内容似乎是动态加载的,因此在加载期间不存在。
这意味着您无法访问您下载的 HTML 文件中的元素(如果您不相信我,请尝试在您计算机上的实际文件中查找 job-content,它只会包含占位符和描述符.

看来您必须使用 Selenium 等技术才能执行此任务。 再次强调,无论你做什么(自动),都违反了 indeed.com 的条款和条件,所以我建议无论如何不要做得太过火。

这样试试:

company = xslt_root.xpath("//div[@data-tn-component='jobHeader']/span[@class='company']/text()")
position = xslt_root.xpath("//div[@data-tn-component='jobHeader']/b[@class='jobtitle']//text()")
['The Habitat Company']
['Janitor-A (Scattered Sites)']

一旦我们有了 //div[@data-tn-component='jobHeader'] 路径,事情就变得非常简单:

  1. select 子跨度的文本 /span[@class='company']/text() 获取 company name
  2. /b[@class='jobtitle']//text() 有点复杂:因为职位名称嵌入在字体标签中。但是我们可以 select 使用 //text() 的任何后代文本来获得 位置 .

    另一种方法是 select bfont 节点并使用 text_content() 获取文本(如果需要,递归),例如
    xslt_root.xpath("//div[@data-tn-component='jobHeader']/b[@class='jobtitle']")[0].text_content()