Python 2.7 我试图写一个“机器人检查”的结果(虽然我认为这适用于其他情况)我在迭代数据框。 我试过了
import robotparser
import urlparse
import pandas as pd
df = pd.DataFrame(dict(A=['http://www.python.org'
,'http://www.junksiteIamtellingyou.com'
]))
df
A
0 http://www.python.org
1 http://www.junksiteIamtellingyou.com
agent_name = 'Test'
for i in df['A']:
try:
parser = robotparser.RobotFileParser()
parser.set_url(urlparse.urljoin(i,"robots.txt"))
parser.read()
except Exception as e:
df['Robot'] = 'No Robot.txt'
else:
df['Robot'] = parser.can_fetch(agent_name, i)
df
A Robot
0 http://www.python.org No Robot.txt <<<-- NOT CORRECT
1 http://www.junksiteIamtellingyou.com No Robot.txt
当然,正在发生的是迭代的最后一个值是写入整列值。 Robot的值应为'True'(可以通过从数据框中删除垃圾URL来证明。
我尝试过.loc的一些不同的排列,但无法让它们起作用。它们似乎总是添加行而不是更新现有行的新列。
那么,有没有办法指定要更新的列(使用函数结果)?也许使用.loc(位置),或者还有另一种方法,比如使用lambda?我很感激你的帮助。
答案 0 :(得分:3)
有一个apply
:
import robotparser
import urlparse
import pandas as pd
df = pd.DataFrame(dict(A=['http://www.python.org'
,'http://www.junksiteIamtellingyou.com']))
def parse(i, agent_name):
try:
parser = robotparser.RobotFileParser()
parser.set_url(urlparse.urljoin(i, "robots.txt"))
parser.read()
except Exception as e:
return 'No Robot.txt'
else:
return parser.can_fetch(agent_name, i)
df['Robot'] = df['A'].apply(parse, args=('Test',))