使用 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']
路径,事情就变得非常简单:
- select 子跨度的文本
/span[@class='company']/text()
获取 company name
/b[@class='jobtitle']//text()
有点复杂:因为职位名称嵌入在字体标签中。但是我们可以 select 使用 //text()
的任何后代文本来获得 位置 .
另一种方法是 select b
或 font
节点并使用 text_content()
获取文本(如果需要,递归),例如
xslt_root.xpath("//div[@data-tn-component='jobHeader']/b[@class='jobtitle']")[0].text_content()
我正在尝试使用 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']
路径,事情就变得非常简单:
- select 子跨度的文本
/span[@class='company']/text()
获取 company name /b[@class='jobtitle']//text()
有点复杂:因为职位名称嵌入在字体标签中。但是我们可以 select 使用//text()
的任何后代文本来获得 位置 .另一种方法是 select
b
或font
节点并使用text_content()
获取文本(如果需要,递归),例如
xslt_root.xpath("//div[@data-tn-component='jobHeader']/b[@class='jobtitle']")[0].text_content()