1

我需要解析以下结构的html表:

<table class="table1" width="620" cellspacing="0" cellpadding="0" border="0">
 <tbody>
   <tr width="620">
     <th width="620">Smth1</th>
     ...
   </tr>
   <tr bgcolor="ffffff" width="620">
     <td width="620">Smth2</td>
     ...
   </tr>
   <tr bgcolor="E4E4E4" width="620">
     <td width="620">Smth3</td>
     ...
   </tr>
   <tr bgcolor="ffffff" width="620">
     <td width="620">Smth4</td>
     ...
   </tr>
 </tbody>
</table>

Python代码:

r = requests.post(url,data)
html = lxml.html.document_fromstring(r.text)
rows = html.xpath(xpath1)[0].findall("tr")
#Getting Xpath with FireBug
data = list()
for row in rows:
    data.append([c.text for c in row.getchildren()])

但我在第三行得到了这个:

IndexError: list index out of range

任务是由此形成python dict。行数可能不同。

UPD。 更改了获取 html 代码的方式,以避免请求库可能出现的问题。现在它是一个简单的网址:

html = lxml.html.parse(test_url)

这证明使用 html 一切正常:

lxml.html.open_in_browser(html)

但还是同样的问题:

rows = html.xpath(xpath1)[0].findall('tr')
data = list()
for row in rows:
    data.append([c.text for c in row.getchildren()])

这是xpath1:

'/html/body/table/tbody/tr[5]/td/table/tbody/tr/td[2]/table/tbody/tr/td/center/table'

UPD2。通过实验发现,xpath 在以下情况下崩溃:

xpath1 = '/html/body/table/tbody'
print html.xpath(xpath1)
#print returns []

如果 xpath1 更短,那么它似乎运行良好并[<Element table at 0x2cbadb0>]返回xpath1 = '/html/body/table'

4

2 回答 2

5

您没有包含 XPath,所以我不确定您要做什么,但如果我理解正确,这应该可以

xpath1 = "tbody/tr"
r = requests.post(url,data)
html = lxml.html.fromstring(r.text)
rows = html.xpath(xpath1)
data = list()
for row in rows:
    data.append([c.text for c in row.getchildren()])

这是制作一个项目列表的列表,如下所示:

[['Smth1'], ['Smth2'], ['Smth3'], ['Smth4']]

要获得一个简单的值列表,您可以使用此代码

xpath1 = "tbody/tr/*/text()"
r = requests.post(url,data)
html = lxml.html.fromstring(r.text)
data = html.xpath(xpath1)

这一切都假设 r.text 正是您在那里发布的内容。

于 2013-01-18T00:20:01.363 回答
0

您的.xpath(xpath1)XPath 表达式找不到任何元素。检查该表达式是否有错误。

于 2013-01-17T22:45:47.523 回答