2016-01-22 1 views
1

Продление существующего вопроса и ответа here. Я пытаюсь извлечь имя игрока и его позицию. Выход хотел бы:XPath - извлечение табличных данных с нерегулярным рисунком

playername, position 
EJ Manuel, Quarterbacks 
Tyrod Taylor, Quarterbacks 
Anthony Dixon, Running backs 
... 

Это то, что я сделал до сих пор:

tree = html.fromstring(requests.get("https://en.wikipedia.org/wiki/List_of_current_AFC_team_rosters").text) 

for h3 in tree.xpath("//table[@class='toccolours']//tr[2]"): 
    position = h3.xpath(".//b/text()") 
    players = h3.xpath(".//ul/li/a/text()") 
    print(position, players) 

Вышеуказанные коды могут поставить следующие, но не в том формате, мне нужно.

(['Quarterbacks', 'Running backs', 'Wide receivers', 'Tight ends', 'Offensive linemen', 'Defensive linemen', 'Linebackers', 'Defensive backs', 'Special teams', 'Reserve lists', 'Unrestricted FAs', 'Restricted FAs', 'Exclusive-Rights FAs'], ['EJ Manuel', 'Tyrod Taylor', 'Anthony Dixon', 'Jerome Felton', 'Mike Gillislee', 'LeSean McCoy', 'Karlos Williams', 'Leonard Hankerson', 'Marcus Easley', 'Marquise Goodwin', 'Percy Harvin', 'Dez Lewis', 'Walt Powell', 'Greg Salas', 'Sammy Watkins', 'Robert Woods', 'Charles Clay', 'Chris Gragg', "Nick O'Leary", 'Tyson Chandler', 'Ryan Groy', 'Seantrel Henderson', 'Cyrus Kouandjio', 'John Miller', 'Kraig Urbik', 'Eric Wood', 'T. J. Barnes', 'Marcell Dareus', 'Lavar Edwards', 'IK Enemkpali', 'Jerry Hughes', 'Kyle Williams', 'Mario Williams', 'Jerel Worthy', 'Jarius Wynn', 'Preston Brown', 'Randell Johnson', 'Manny Lawson', 'Kevin Reddick', 'Tony Steward', 'A. J. Tarpley', 'Max Valles', 'Mario Butler', 'Ronald Darby', 'Stephon Gilmore', 'Corey Graham', 'Leodis McKelvin', 'Jonathan Meeks', 'Merrill Noel', 'Nickell Robey', 'Sammy Seamster', 'Cam Thomas', 'Aaron Williams', 'Duke Williams', 'Dan Carpenter', 'Jordan Gay', 'Garrison Sanborn', 'Colton Schmidt', 'Blake Annen', 'Jarrett Boykin', 'Jonathan Dowling', 'Greg Little', 'Jacob Maxwell', 'Ronald Patrick', 'Cedric Reed', 'Cyril Richardson', 'Phillip Thomas', 'James Wilder, Jr.', 'Nigel Bradham', 'Ron Brooks', 'Alex Carrington', 'Cordy Glenn', 'Leonard Hankerson', 'Richie Incognito', 'Josh Johnson', 'Corbin Bryant', 'Stefan Charles', 'MarQueis Gray', 'Chris Hogan', 'Jordan Mills', 'Ty Powell', 'Bacarri Rambo', 'Cierre Wood']) 
(['Quarterbacks', 'Running backs', 'Wide receivers', 'Tight ends', 'Offensive linemen', 'Defensive linemen', 'Linebackers', 'Defensive backs', 'Special teams', 'Reserve lists', 'Unrestricted FAs', 'Restricted FAs', 'Exclusive-Rights FAs'], ['Zac Dysert', 'Ryan Tannehill', 'Logan Thomas', 'Jay Ajayi', 'Jahwan Edwards', 'Damien Williams', 'Tyler Davis', 'Robert Herron', 'Greg Jennings', 'Jarvis Landry', 'DeVante Parker', 'Kenny Stills', 'Jordan Cameron', 'Dominique Jones', 'Dion Sims', 'Branden Albert', 'Jamil Douglas', "Ja'Wuan James", 'Vinston Painter', 'Mike Pouncey', 'Anthony Steen', 'Dallas Thomas', 'Billy Turner', 'Deandre Coleman', 'Quinton Coples', 'Terrence Fede', 'Dion Jordan', 'Earl Mitchell', 'Damontre Moore', 'Jordan Phillips', 'Ndamukong Suh', 'Charles Tuaau', 'Robert Thomas', 'Cameron Wake', 'Julius Warmsley', 'Jordan Williams', 'Neville Hewitt', 'Mike Hull', 'Jelani Jenkins', 'Terrell Manning', 'Chris McCain', 'Koa Misi', 'Zach Vigil', 'Walt Aikens', 'Damarr Aultman', 'Brent Grimes', 'Reshad Jones', 'Tony Lippett', 'Bobby McCain', 'Brice McCain', 'Tyler Patmon', 'Dax Swanson', 'Jamar Taylor', 'Matt Darr', 'John Denney', 'Andrew Franks', 'Louis Delmas', 'James-Michael Johnson', 'Rishard Matthews', 'Jacques McClendon', 'Lamar Miller', 'Matt Moore', 'Spencer Paysinger', 'Derrick Shelby', 'Kelvin Sheppard', 'Shelley Smith', 'Olivier Vernon', 'Michael Thomas', 'Brandon Williams', 'Shamiel Gary', 'Matt Hazel', 'Ulrick John', 'Jake Stoneburner']) 
... 

Любые предложения?

enter image description here

ответ

1

Вы можете использовать вложенный цикл для выполнения этой задачи. Первый цикл по позициям, а затем, для каждой позиции, петля через соответствующие игроки:

#loop through positions 
for b in tree.xpath("//table[@class='toccolours']//tr[2]//b"): 
    #get current position text 
    position = b.xpath("text()")[0] 
    #get players that correspond to the current position 
    for a in b.xpath("following::ul[1]/li/a[not(*)]"): 
     #get current player text 
     player = a.xpath("text()")[0] 
     #print current position and player together 
     print(position, player) 

Последняя часть продукции:

..... 
('Reserve lists', 'Chris Watt') 
('Reserve lists', 'Eric Weddle') 
('Reserve lists', 'Tourek Williams') 
('Practice squad', 'Alex Bayer') 
('Practice squad', 'Isaiah Burse') 
('Practice squad', 'Richard Crawford') 
('Practice squad', 'Ben Gardner') 
('Practice squad', 'Michael Huey') 
('Practice squad', 'Keith Lewis') 
('Practice squad', 'Chuka Ndulue') 
('Practice squad', 'Tim Semisch') 
('Practice squad', 'Brad Sorensen') 
('Practice squad', 'Craig Watts') 
+0

Это прекрасно работает! Спасибо! @ har07 – kevin

Смежные вопросы