8

我正在尝试阅读整个网页并将其分配给一个变量,但我无法做到这一点。该变量似乎只能保存页面源的前 512 行左右。

我尝试使用 readlines() 将源代码的所有行打印到屏幕上,这给了我完整的源代码,但我需要能够用正则表达式解析它,所以我需要以某种方式将它存储在一个变量中. 帮助?

 data = urllib2.urlopen(url)
 print data

只给了我大约 1/3 的来源。

 data = urllib2.urlopen(url)
 for lines in data.readlines()
      print lines

这给了我整个来源。

就像我说的,我需要能够用正则表达式解析字符串,但我需要的部分不在我能够存储在变量中的前 1/3 中。

4

5 回答 5

5

您应该能够使用file.read()将整个文件读入字符串。这将为您提供整个来源。就像是

data = urllib2.urlopen(url)
print data.read()

应该给你整个网页。

从那里开始,不要使用正则表达式解析 HTML(这里是陈旧的帖子),而是使用专用的 HTML 解析器。或者,清理 HTML 并将其转换为 XHTML(例如使用 HTML Tidy),然后使用像标准ElementTree这样的 XML 解析库。哪种方法最好取决于您的应用程序。

于 2012-06-06T05:00:01.897 回答
5

您可能正在寻找美丽的汤:http ://www.crummy.com/software/BeautifulSoup/ 这是一个用于 python 的开源 Web 解析库。祝你好运!

于 2012-06-06T04:54:16.377 回答
1

实际上,print data不应该给你任何 html 内容,因为它只是一个文件指针。官方文档https://docs.python.org/2/library/urllib2.html

此函数返回一个类似文件的对象

这就是我得到的:

print data
<addinfourl at 140131449328200 whose fp = <socket._fileobject object at 0x7f72e547fc50>>

readlines()返回 html 源代码行列表,您可以将其存储在字符串中,例如:

import urllib2
data = urllib2.urlopen(url)
l = []
s = ''
for line in data.readlines():
    l.append(line)
s = '\n'.join(l)

您可以根据需要使用 listl或 string s

于 2015-08-09T13:35:07.613 回答
0

我还建议使用开源 Web 解析库来轻松工作,而不是使用正则表达式进行完整的 HTML 解析,无论您需要正则表达式进行 url 解析的任何方式。

于 2012-06-06T08:18:38.843 回答
0

如果你想在之后解析变量,你可以使用gazpacho

from gazpacho import Soup

url = "https://www.example.com"
soup = Soup.get(url)
str(soup)

这样你就可以执行finds 来提取你想要的信息!

于 2020-10-09T22:43:31.987 回答