【问题标题】:strange behaviour for xpath "//tr" and etree.findall while scraping in python在 python 中抓取时 xpath "//tr" 和 etree.findall 的奇怪行为
【发布时间】:2015-02-22 05:39:43
【问题描述】:

我正在抓取一个网站(经许可)。但是在这里我在选择table 的所有tr 元素时遇到了非常不规则的行为。
如果使用 xpath 选择它给我 67 长度,而如果我使用 findall 选择它给我 3 这是真的。
工作示例

import urllib2
from lxml import html
from lxml import etree
import string
import csv

req_headers = {
    'User-agent':
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safar/537.36'
    }
anz_extra_url = u"https://sg.anz.com/apps/wealth/"
request = urllib2.Request(anz_extra_url, None, req_headers)
page = urllib2.urlopen(request).read()
parser = etree.HTMLParser()
table_root = etree.fromstring(page, parser)
all_tables = table_root.xpath("//table[@width=869]")
len(all_tables[1].findall("tr"))
#output = 3
len(all_tables[1].xpath("//tr"))
#output = 67

编辑:
all_tables[1] 的结构如下所示

etree.tostring(all_tables[1])
#output
<table width="869" border="0" cellpadding="0" cellspacing="1">&#13;\n                            <tr>&#13;\n                                <td width="35%" align="left" bgcolor="#004165" style="font-weight: bold; color: #FFFFFF; padding: 5px 15px;">&#13;\n                                    Placement Amount</td>&#13;\n                                <td width="65%" bgcolor="#004165" style="font-weight: bold; color: #FFFFFF; padding: 5px 15px;;" align="center">&#13;\n                                    9-Month ANZ Instant Interest Time Deposit Interest Rate                                </td>&#13;\n                            </tr>&#13;\n                            <tr>&#13;\n                                <td align="left" style="padding: 5px 15px;">&#13;\n                                    SGD150,000 and above&#13;\n                                </td>&#13;\n                                <td align="center" style="padding: 5px 15px;">&#13;\n                                    1.38% p.a.&#13;\n                                </td>&#13;\n                            </tr>&#13;\n                            <tr>&#13;\n                                <td align="left" bgcolor="#C6DFEA" style="padding: 5px 15px;">&#13;\n                                    Below SGD150,000</td>&#13;\n                                <td align="center" bgcolor="#C6DFEA" style="padding: 5px 15px;">&#13;\n                                    0.70% p.a.&#13;\n                                </td>&#13;\n                            </tr>&#13;\n                        </table>&#13;\n                        \n

那么为什么会这样呢?

谢谢

【问题讨论】:

  • all_tables[1] 看起来像什么? tr 的子元素是什么? //tr 将返回所有 tr 元素及其后代。
  • @DaveCoast 添加表结构

标签: python python-2.7 parsing xpath elementtree


【解决方案1】:

xpath 表达式//tr 匹配所有tr 元素,从文档根开始。如果你想要 tr 作为上下文后代的元素,你需要 .//tr

【讨论】:

  • 不是那么隐含,因为我只在给定的表上操作 xpath。事情是有些时候 //tr 工作,有时不。您能否提供有关该行为的更多详细信息?
  • 不,这不是隐含的。就像文件路径:如果它以/ 开头,它是从文档根目录开始的绝对路径,当前上下文唯一用于查找合适的根目录。如果要从提供的上下文开始,则必须以. 开头
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多