到目前为止,这是我的代码:
import urllib
import urllib.request
from bs4 import BeautifulSoup
def make_soup(url):
page = urllib.request.urlopen(url)
soupdata = BeautifulSoup(page, "html.parser")
return soupdata
soup = make_soup('http://www.lassen.co.nz/pickandgo.php?fyear=q&teama=SAF#hrh')
table = soup.find_all('table')[1]
for record in table.find_all('tr'):
for data in record.find_all('td'):
print(data.text)
目前它打印表格的内容,循环遍历所有列。我怎样才能使它能够专门抓取某一列和某一行?例如,如果我想要它抓住第1行和第1行第5列(目前有41-23的数据),怎么回事?我可以打印出确切的数据吗?谢谢。
here is the webpage
答案 0 :(得分:2)
使用enumerate可以同时获取索引和数据:
import urllib
import urllib.request
from bs4 import BeautifulSoup
def make_soup(url):
page = urllib.request.urlopen(url)
soupdata = BeautifulSoup(page, "html.parser")
return soupdata
soup = make_soup('http://www.lassen.co.nz/pickandgo.php?fyear=q&teama=SAF#hrh')
table = soup.find_all('table')[1]
for row, record in enumerate(table.find_all('tr')):
for col, data in enumerate(record.find_all('td')):
if row == 1 and col == 4:
print(data.text)
请注意,索引从0
开始,但由于您跳过标题行,因此您希望捕获索引1
处的行。对于第五列,您需要索引4
。
答案 1 :(得分:1)
您无需查看所需数据的所有列和行。
首先准备-Skip
。
soup
从页面获取所有表格。
>>> import bs4
>>> import requests
>>> page = requests.get('http://www.lassen.co.nz/pickandgo.php?fyear=q&teama=SAF#hrh').content
>>> soup = bs4.BeautifulSoup(page, 'lxml')
您已经知道所需的表格不是页面上的第一个,而是第二个。让我们给它一个名称以便于参考。
>>> tables = soup.findAll('table')
现在让我们得到它的行。
>>> SAF_vs_ALL_table = tables[1]
它的第一行实际上是一个标题。我们想要第二行。
>>> SAF_vs_ALL_rows = SAF_vs_ALL_table.findAll('tr')
然后让我们获取第二行的列,然后查看第五列的HTML。
>>> SAF_vs_ALL_rows[1].text
'Sat, 26 Aug 2017RC South Africa v Argentina41-235:28-0SaltaA'
我们可以看到以下列方式提取第五列的内容是一件简单的事情。
>>> columns = SAF_vs_ALL_rows[1].findAll('td')
>>> columns[4]
<td class="cenb">41-23</td>
我注意到你在另一个答案的评论中提出的问题。您可以将此字符串放入变量中以供后续使用:
>>> columns[4].text
'41-23'
你说过你是新手。我们大多数人都从BeautifulSoup开始,它最适合许多任务。但是,您应该知道有其他选择。在这种情况下,最好的可能是scrapy。将页面的HTML放在score = columns[4].text
中就可以了。这就是它。
page