【问题标题】:Why am I not getting the full text of this page?为什么我没有得到此页面的全文?
【发布时间】:2013-10-26 01:10:59
【问题描述】:

我正在使用 BeautifulSoup 为 ez_setup.pyget-pip.py 脚本链接抓取 pip 安装指南 webpage。当我找到这些链接时,我使用 BeautifulSoup 的 get_text() 来获取所有文本。

现在,这适用于 get-pip.py 链接,但不适用于 ez_setup.py 链接。我检索了 get-pip.py 的所有文本,但对于 ez_setup.py,我只检索到第 318 行的文本,这甚至不是完整的第 318 行。

317    if options.user_install:
318        if sys.version_info 

这是我的代码。

#imports

def makeSoup(url):
    return BeautifulSoup(urllib2.urlopen(url).read())

url = "http://www.pip-installer.org/en/latest/installing.html"
for url in makeSoup(url).find_all('a', attrs = {'href':re.compile(r'py$')}):
    with open(desktop + "\\" + url['href'].split('/')[-1], "w", 0) as file:
        file.write(makeSoup(url['href']).get_text())

如何检索 ez_setup.py 的所有文本?

【问题讨论】:

  • 哦,继续把完整的进口清单放在那里。只是,什么,三个额外的行? :)
  • 为什么要在 Beautiful Soup 中包装 Python 脚本,然后首先调用 get_text

标签: python python-2.7 file-io beautifulsoup


【解决方案1】:

问题是您试图将 Python 源代码解析为 HTML,然后从中剥离文本。

所以,第 318 行是:

    if sys.version_info < (2, 6):

这恰好是文件中的第一个 &lt; 字符。由于您试图将其解析为 HTML,这意味着文件的其余部分是永远不会完成的 HTML 标记的一部分。

根据您使用的三个解析器中的哪一个以及哪个版本,bs4 可能会确定它毕竟不是一个标签并给您原始数据,或者引发异常,或者去掉整个虚假标签。

无论如何,解决方法很简单:不要将 Python 源代码解析为 HTML。就这样写吧:

urllib2.urlopen(url['href']).read()

【讨论】:

  • 好的,现在关于&lt; 的部分是我没有考虑的。那讲得通。没有意义的是,我第一次尝试获取脚本是通过 urllib2 就像你所拥有的一样。但是,当我在上下文管理器中编写后立即使用os.system("python " + file.name) 运行脚本时,我会得到EOF while scanning triple-quoted string literal。因此使用 BeautifulSoup。好吧,我现在运行它们,我没有收到错误。
  • @KrimCard:我不明白您为什么认为将脚本解析为 HTML 然后将其转换回文本可能会有所帮助。只是在问题上随意扔东西,希望它们可能会有所帮助,这并不是一个好主意。查看您下载的文本,看看出了什么问题,然后您就可以弄清楚如何修复它(或询问某人,例如在 SO 上)。
  • @KrimCard:附带说明一下,您几乎从不想使用os.system,正如该函数的文档所说的那样。查看subprocess 模块以获得更好的选择,它同样简单且没有任何问题。
猜你喜欢
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 2020-11-19
  • 2013-07-15
  • 2012-08-12
  • 1970-01-01
相关资源
最近更新 更多