可以使用XPath选择器(lxml)抓取HTML数据属性吗?
我正在尝试从这个网站抓取所有的招聘页面: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
实例来完成——只需阅读文档即可。