是否可以使用XPath选择器(lxml)来刮取html数据属性?

时间:2014-05-05 23:28:20

标签: python html xpath lxml custom-data-attribute

我正试图从这个网站上抓取所有职业网页:http://wearemadeinny.com/find-a-job/

我尝试了下面的内容,但不幸的是,当您点击其中一个公司页面时,只显示href:

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>元素之一。我特别想拉数据-hiringurl =&#34; http://www.admeld.com/about/jobs/"此元素的xpath是// * [@ id =&#34; v7&#34;]

<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 个答案:

答案 0 :(得分:5)

通过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实例完成 - 只需阅读文档。