可以使用XPath选择器(lxml)抓取HTML数据属性吗?

3 投票
1 回答
3529 浏览
提问于 2025-04-18 05:29

我正在尝试从这个网站抓取所有的招聘页面:http://wearemadeinny.com/find-a-job/

我试过下面的方法,但不幸的是,只有在点击某个公司页面时,链接才会出现:

from lxml import html
import requests

page = requests.get("http://wearemadeinny.com/find-a-job/")
tree = lxml.html.fromstring(page.text)

jobs = tree.xpath('//*[@id="venue-hiring"]/a/@href')

links = [x for x in jobs]

print links

我注意到每个 <li> 标签里都有一些 HTML 数据属性,这些属性里面包含了招聘页面的链接。那么,是否可以从每个 <li> 中抓取 data-hiringurl 属性呢?如果用 lxml 和 XPath 选择器不行,还有其他方法吗?

这是我想要提取的一个 <li> 元素。我特别想提取 data-hiringurl="http://www.admeld.com/about/jobs/" 这个链接。这个元素的 XPath 是 //*[@id="v7"]

<li id="v7" data-vid="7" data-name="Admeld" data-address="230 Park Avenue South Suite 1201" data-lat="40.7378349" data-long="-73.9886703" data-url="http://www.admeld.com/" data-hiring="1" data-hiringurl="http://www.admeld.com/about/jobs/" data-whynyc="" data-category="1"><a href="#" class="list-digital">
<span class="venue-name">Admeld</span><br>
<span class="venue-address">230 Park Avenue South</span>
<br><span class="venue-hiring">We are hiring!</span>                                    
</a>
</li>

1 个回答

7

通过lxml搜索期望的内容

这里假设你已经有了包含你需要的数据的页面内容。代码展示了如何通过http请求获取这些内容,如果需要在浏览器中渲染,请查看我回答后面的部分,了解如何获取。

如果你想获取所有在属性 data-hiringurl 中的值,可以尝试使用XPath //@data-hiringurl

from lxml import html
import requests

url = "http://wearemadeinny.com/find-a-job/"

page = requests.get(url)
tree = html.fromstring(page.text) # corrected, used to be `lxml.html.fromstring`

xp = "//@data-hiringurl"
job_urls = tree.xpath(xp)

print print job_urls

不过我不确定你提供的链接是否包含这样的数据。我在里面没有找到。

获取由JavaScript渲染的页面内容

如果页面上的内容是动态生成的,也就是说是在客户端渲染的,你需要提供浏览器的环境,让它在里面进行渲染。使用 selenium 可以完成这个工作:

>>> from selenium import webdriver
>>> browser = webdriver.Firefox()
>>> url = "http://wearemadeinny.com/find-a-job/"
>>> browser.get(url)
>>> page = browser.page_source
>>> print page

现在你在 page 变量中有了页面的内容,你可以像上面描述的那样继续使用 lxml

注意:我不能保证你会在页面中找到期望的内容,我只知道它是以渲染的形式出现的。但是如果你需要通过点击页面上的某些元素、填写文本、按按钮等方式继续操作,这些都可以通过上面提到的 browser 实例来完成——只需阅读文档即可。

撰写回答