如何使用PyCall在Julia中使用内置的Python read()函数?

时间:2015-06-16 19:45:09

标签: python io julia

我正在使用Julia,现在我正在尝试使用PyCall包,以便我可以使用BeautifulSoup模块进行Web解析。我的Julia代码看起来像

using PyCall
pyinitialize("python3")
@pyimport bs4 #need BeautifulSoup
@pyimport urllib.request as urllib #need urlopen

url_base = "blah"
html = urllib.urlopen(url_base).read()
soup = bs4.BeautifulSoup(html, "lxml")

但是,当我尝试运行它时,我会收到有关read()功能的投诉。我首先想到read()将是一个内置的Python函数,但pybuiltin("read")没有用。

我不确定我可以导入哪些Python模块来获取读取功能。我尝试导入io模块并使用io.read(),但这不起作用。此外,使用Julia的内置阅读功能并不起作用,因为urllib.urlopen(url_base)PyObject

2 个答案:

答案 0 :(得分:1)

你有一个错字:

html = urllib.urlopen(url_base).read()

应该是

html = urllib.urlopen(url_base)[:read]()

请参阅PyCall文档:

  

重要事项:与Python最大的区别在于,使用o[:attribute]而非o.attribute访问对象属性/成员,以便Python中的o.method(...)被替换在朱莉娅的o[:method](...)。此外,您使用get(o, key)而不是o[key]。 (但是,您可以通过o[i]访问整数索引,就像在Python中一样,虽然使用基于1的Julian索引而不是基于0的Python索引。)

答案 1 :(得分:0)

您需要拆分才能阅读回复。而不是:

html = urllib.urlopen(url_base).read()

尝试:

with urllib.urlopen(url_base) as response:
    html = response.read()

Python 3在很大程度上提高了清晰度和可读性。