繁体   English   中英

抓取html表-python

[英]Scraping a html table - python

我在从html抓取表格时遇到问题。 实际上,这是一个更大的表中的3个表。 我正在使用BS4,它可以正常工作直到找到所有'td'标签,但是当我尝试打印所需信息时,该程序将在第一个表的末尾停止并显示以下错误消息:

“ IndexError:列表索引超出范围”

import re
import urllib2
from bs4 import BeautifulSoup

url = 'http://trackinfo.com/entries-alphabetical.jsp?raceid13=GBR$20140314A'
page = urllib2.urlopen(url).read()
soup = BeautifulSoup(page)


for tr in soup.find_all('tr')[2:]:
  tds = tr.find_all('td')
  print tds[0].text, tds[1].text

任何想法如何解决?

通过查看您的代码,可以在循环中假设在找到的tr元素列表中始终(至少)有2个td元素。 如果在某些情况下tr元素包含少于2个元素,则会引发IndexError。

尝试将循环更改为以下形式:

for tr in soup.find_all('tr')[2:]:
  tds = tr.find_all('td')
  if len(tds) >= 2:
    print tds[0].text, tds[1].text

td元素的数量必须为2或更大的检查是针对要解析的页面的,我想您希望将两个值一起编写。 一个更通用的解决方案可能是:

for tr in soup.find_all('tr')[2:]:
  for td in tr.find_all('td'):
    print td.text

这个想法是遍历顶级表内的表,然后为每个表遍历行(除了第一个有标题的行):

import urllib2
from bs4 import BeautifulSoup


url = 'http://trackinfo.com/entries-alphabetical.jsp?raceid13=GBR$20140314A'
soup = BeautifulSoup(urllib2.urlopen(url))

for index, table in enumerate(soup.find('table').find_all('table')):
    print "Table #%d" % index
    for tr in table.find_all('tr')[1:]:
        tds = tr.find_all('td')
        print "Runner: %s, Race: %s" % (tds[0].text.strip(), tds[1].text.strip())

打印:

Table #0
Runner: ALL SHOOK UP, Race: 11
Runner: ARLINGTON ADIE, Race: 9
Runner: BARTS BIKERCHICK, Race: 10
Runner: BARTS GAME DAY, Race: 4
Runner: BARTS SIR PRIZE, Race: 7
Runner: BJ'S PIZAZZ, Race: 7
Runner: BOC'S BAMA BOY, Race: 14
Runner: BOC'S BRADBERRY, Race: 2
Runner: BOC'S CRIMSNTIDE, Race: 9
...

另外,请注意,您可以将urllib2.urlopen(url)直接传递给BeautifulSoup构造函数-它将在内部调用read()

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM