我通常使用selenium webdriver来抓取网站内容,但页面实际加载所需的时间确实会减慢任何大规模的信息收集速度。
我最近发现了请求,并成功使用它来获取特定页面的图像。我现在想抓住一些围绕该图像的文字。
我可以通过
获取htmlfrom lxml import html
import requests
page = requests.get("website")
tree = html.fromstring(page.text)
如何在特定xpath的特定内容中对此html进行排序?
我一直在尝试关注this tutorial,我使用lxml通过xpaths从html获取信息。
这似乎工作正常,但每当我尝试提取数据时,列表都是空的。
html看起来像这样:
<tr>
<td class="LargeBody" align="right" width="15%" valign="top" nowrap="nowrap">
<strong>1000</strong> //I want this number
</td>
<td class="LargeBody" align="left" width="85%">
<strong>4/0 Business Cards-Kathleen Kelly</strong>
<font class="SmallBody">(custom)</font>
</td>
</tr>
我尝试了以下内容:
quantity = tree.xpath('/html/body/form[1]/table[3]/tbody[1]/tr/td[2]/table/tbody/tr/td[1]/table/tbody/tr/td/table[1]/tbody/tr[1]/td[2]/strong')
print quantity
[]
quantity = tree.xpath('//*[@id="jobLineItems"]/tbody[1]/tr/td[2]/table/tbody/tr/td[1]/table/tbody/tr/td/table[1]/tbody/tr[1]/td[1]/strong')
print quantity
[]
我一直在拿回空名单。知道我哪里出错了,或者如何更好地在强标签中获取文字?
修改
我使用text_content()来检查正在查看的内容树。
print tree.text_content()
这导致了登录页面。
然后我查找了如何传递身份验证,并编辑了我的页面请求以包含它。
page = requests.get('webpage', auth=('user', 'pass'))
然而,它仍然返回一个空列表。
当我尝试下面的代码时,它仍然会将我带到登录页面。
page = requests.get('webpage', auth=('user', 'pass'))
tree = html.fromstring(page.text)
print tree.text_content()
我也尝试过:
from requests.auth import HTTPDigestAuth
page = requests.get('webpage', auth=HTTPDigestAuth('user', 'pass'))
但仍然登陆登录页面。
修改2
我试图弄清楚正在使用哪种类型的身份验证。
我试过
r = requests.get('website', auth=HTTPDigestAuth('user', 'pass')))
r.headers
返回
{'content-length': '7690', 'charset': 'utf-8', 'x-powered-by': 'PHP/5.3.3', 'expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 'server': 'Apache/2.2.15 (CentOS)', 'connection': 'close', 'pragma': 'no-cache', 'cache-control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'date': 'Tue, 14 Oct 2014 17:44:04 GMT', 'content-type': 'text/html; charset=UTF-8'}
但这似乎并不表示身份验证类型是什么。
编辑3
有人在别处向我指出我的POST数据正在通过。 I looked up how to send POST data here。我试了下面的内容。
payload = {'login_pass': 'pass', 'login_user': 'user'}
r = requests.post("website", data=payload)
这似乎把我带到了我想要的页面。但是,当我尝试
时print r.text
它崩溃了我的IDLE但显示的数据显示了我正在寻找的页面中的元素而不是登录页面。
当我尝试
时from lxml import html
import requests
payload = {'login_pass': '12StultsRd', 'login_user': 'megalimidi'}
r = requests.post("http://myag1.mypresswise.com/o/order.php?orderID=226523", data=payload)
print r.encoding
tree = html.fromstring(r.text)
print tree
print tree.text_content()
我得到了
UTF-8
<Element html at 0x112401d08>
Traceback (most recent call last):
File "/Users/meir/Documents/PYTHON/GetImageAsPdf/ImageToPDF_scrappy_beta.py", line 11, in <module>
print tree.text_content()
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/idlelib/PyShell.py", line 1343, in write
return self.shell.write(s, self.tags)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/idlelib/rpc.py", line 595, in __call__
value = self.sockio.remotecall(self.oid, self.name, args, kwargs)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/idlelib/rpc.py", line 210, in remotecall
seq = self.asynccall(oid, methodname, args, kwargs)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/idlelib/rpc.py", line 225, in asynccall
self.putmessage((seq, request))
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/idlelib/rpc.py", line 324, in putmessage
s = pickle.dumps(message)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle _ElementUnicodeResult objects