使用lxml和请求在强标签之间获取文本?目前返回空列表

时间:2014-10-14 16:26:44

标签: python html-parsing lxml python-requests

我通常使用selenium webdriver来抓取网站内容,但页面实际加载所需的时间确实会减慢任何大规模的信息收集速度。

我最近发现了请求,并成功使用它来获取特定页面的图像。我现在想抓住一些围绕该图像的文字。

我可以通过

获取html
from 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

0 个答案:

没有答案