我正在尝试使用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的情况下加载。
我非常感谢您对提取这两个值的任何帮助。
答案 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']
路径,事情就会变得非常简单:
/span[@class='company']/text()
的文本以获取公司名称 /b[@class='jobtitle']//text()
有点令人费解:因为工作标题嵌入在字体标签中。但是我们可以使用//text()
选择任何后代文本以获取位置。
另一种选择是选择b
或font
节点,然后使用text_content()
来获取文本(如果需要,则以递归方式),例如
xslt_root.xpath("//div[@data-tn-component='jobHeader']/b[@class='jobtitle']")[0].text_content()
答案 1 :(得分:0)
尽管您做出了假设,但页面上的内容似乎是动态加载的,因此在加载期间不存在。
这意味着您无法访问下载的HTML文件中的元素(如果您不相信我,请尝试在计算机上的实际文件中查找job-content
,该文件仅包含占位符和描述符。
似乎您必须使用Selenium之类的技术来执行此任务。 再一次,我想强调,您所做的任何事情(自动)都违反了确实居然。com的条款和条件,所以我建议无论如何不要太过分。