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

时间:2018-07-16 04:29:57

标签: python html xpath lxml

我正在尝试使用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)

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

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

我非常感谢您对提取这两个值的任何帮助。

2 个答案:

答案 0 :(得分:1)

像这样尝试:

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. 选择子范围/span[@class='company']/text()的文本以获取公司名称
  2. /b[@class='jobtitle']//text()有点令人费解:因为工作标题嵌入在字体标签中。但是我们可以使用//text()选择任何后代文本以获取位置

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

答案 1 :(得分:0)

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

似乎您必须使用Selenium之类的技术来执行此任务。 再一次,我想强调,您所做的任何事情(自动)都违反了确实居然。com的条款和条件,所以我建议无论如何不要太过分。