使用 Xpath 从网站提取信息,Python
Extract information from website using Xpath, Python
正在尝试从网站中提取一些有用的信息。我来了一点,现在我卡住了,需要你的帮助!
我需要这个 table
的信息
http://gbgfotboll.se/serier/?scr=scorers&ftid=57700
我写了这段代码,得到了我想要的信息:
import lxml.html
from lxml.etree import XPath
url = ("http://gbgfotboll.se/serier/?scr=scorers&ftid=57700")
rows_xpath = XPath("//*[@id='content-primary']/div[1]/table/tbody/tr")
name_xpath = XPath("td[1]//text()")
team_xpath = XPath("td[2]//text()")
league_xpath = XPath("//*[@id='content-primary']/h1//text()")
html = lxml.html.parse(url)
divName = league_xpath(html)[0]
for id,row in enumerate(rows_xpath(html)):
scorername = name_xpath(row)[0]
team = team_xpath(row)[0]
print scorername, team
print divName
我收到这个错误
scorername = name_xpath(row)[0]
IndexError: list index out of range
我明白为什么会出现错误。我真正需要帮助的是我只需要前 12 行。这是提取物在这三种可能的情况下应该做的事情:
如果少于12行:取除最后一行以外的所有行。
如果有12行:同上..
如果超过 12 行:只需取前 12 行。
我该怎么做?
EDIT1
这不是重复的。当然是同一个网站。但我已经完成了那个人想要的,即从该行中获取所有值。我已经可以做到了。我不需要最后一行,如果有的话我不希望它提取超过 12 行..
这是根据您在 post 中描述的内容获取所需行的方法。这只是基于 rows
是一个列表的概念的逻辑,您必须根据需要将其合并到您的代码中。
if len(rows) <=12:
print rows[0:-1]
elif len(rows) > 12:
print rows[0:12]
我觉得是不是你想要的:
#coding: utf-8
from lxml import etree
import lxml.html
collected = [] #list-tuple of [(col1, col2...), (col1, col2...)]
dom = lxml.html.parse("http://gbgfotboll.se/serier/?scr=scorers&ftid=57700")
#all table rows
xpatheval = etree.XPathDocumentEvaluator(dom)
rows = xpatheval('//div[@id="content-primary"]/div/table[1]/tbody/tr')
# If there are less than 12 rows (or <=12): Take all the rows except the last.
if len(rows) <= 12:
rows.pop()
else:
# If there are more than 12 rows: Simply take the first 12 rows.
rows = rows[0:12]
for row in rows:
# all columns of current table row (Spelare, Lag, Mal, straffmal)
columns = row.findall("td")
# pick textual data from each <td>
collected.append([column.text for column in columns])
for i in collected: print i
输出:
正在尝试从网站中提取一些有用的信息。我来了一点,现在我卡住了,需要你的帮助!
我需要这个 table
的信息http://gbgfotboll.se/serier/?scr=scorers&ftid=57700
我写了这段代码,得到了我想要的信息:
import lxml.html
from lxml.etree import XPath
url = ("http://gbgfotboll.se/serier/?scr=scorers&ftid=57700")
rows_xpath = XPath("//*[@id='content-primary']/div[1]/table/tbody/tr")
name_xpath = XPath("td[1]//text()")
team_xpath = XPath("td[2]//text()")
league_xpath = XPath("//*[@id='content-primary']/h1//text()")
html = lxml.html.parse(url)
divName = league_xpath(html)[0]
for id,row in enumerate(rows_xpath(html)):
scorername = name_xpath(row)[0]
team = team_xpath(row)[0]
print scorername, team
print divName
我收到这个错误
scorername = name_xpath(row)[0]
IndexError: list index out of range
我明白为什么会出现错误。我真正需要帮助的是我只需要前 12 行。这是提取物在这三种可能的情况下应该做的事情:
如果少于12行:取除最后一行以外的所有行。
如果有12行:同上..
如果超过 12 行:只需取前 12 行。
我该怎么做?
EDIT1
这不是重复的。当然是同一个网站。但我已经完成了那个人想要的,即从该行中获取所有值。我已经可以做到了。我不需要最后一行,如果有的话我不希望它提取超过 12 行..
这是根据您在 post 中描述的内容获取所需行的方法。这只是基于 rows
是一个列表的概念的逻辑,您必须根据需要将其合并到您的代码中。
if len(rows) <=12:
print rows[0:-1]
elif len(rows) > 12:
print rows[0:12]
我觉得是不是你想要的:
#coding: utf-8
from lxml import etree
import lxml.html
collected = [] #list-tuple of [(col1, col2...), (col1, col2...)]
dom = lxml.html.parse("http://gbgfotboll.se/serier/?scr=scorers&ftid=57700")
#all table rows
xpatheval = etree.XPathDocumentEvaluator(dom)
rows = xpatheval('//div[@id="content-primary"]/div/table[1]/tbody/tr')
# If there are less than 12 rows (or <=12): Take all the rows except the last.
if len(rows) <= 12:
rows.pop()
else:
# If there are more than 12 rows: Simply take the first 12 rows.
rows = rows[0:12]
for row in rows:
# all columns of current table row (Spelare, Lag, Mal, straffmal)
columns = row.findall("td")
# pick textual data from each <td>
collected.append([column.text for column in columns])
for i in collected: print i