我决定使用Python(使用lxml和请求)进行网络抓取。我正在努力学习的网页是:http://www.football-lineups.com/season/Real_Madrid/2013-2014
我想要抓的是网页左侧的表格(使用得分和编队的表格)。这是我正在使用的代码:
from lxml import html
import requests
page=requests.get("http://www.football-lineups.com/season/Real_Madrid/2013-2014")
tree=html.fromstring(page.text)
competition=tree.xpath('//*[@id="sptf"]/table/tbody/tr[2]/td[4]/font/text()')
print competition
我输入的xpath是我从Chrome复制过的xpath。代码通常应该返回表格中第一场比赛的比赛(即西甲联赛)。换句话说,它应该返回第二行,第四列条目(Web布局上有一个随机的第二列,我不知道为什么)。但是,当我运行代码时,我得到一个空列表。这段代码可能在哪里出错?
答案 0 :(得分:1)
如果您检查页面的行来源,您将看到阵容表不存在。 它是在使用AJAX加载页面后提供的,所以你只能通过获取http://www.football-lineups.com/season/Real_Madrid/2013-2014才能获取它,因为JS不会被解释,因此AJAX没有被执行。
AJAX请求如下:
也许您可以伪造获取此数据的请求。我会让你分析那些名字很好的dX参数:)
答案 1 :(得分:0)
在这里,我提供了满足您要求的完整代码:
from selenium import webdriver
import csv
url="http://www.football-lineups.com/season/Real_Madrid/2013-2014"
driver=webdriver.Chrome('./chromedriver.exe')
driver.get(url)
myfile = open('demo.csv', 'wb')
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
tr_list=driver.find_elements_by_xpath("//span[@id='sptf']/table/tbody/tr")
for tr in tr_list:
lst=[]
for td in tr.find_elements_by_tag_name('td'):
lst.append(td.text)
wr.writerow(lst)
driver.quit()
myfile.close()