为什么 urllib 不适用于本地网站?

Why doesn't urllib work with local website?

我的 urllib 有问题,我似乎无法抓取我自己的本地网站。我可以让它打印出网站的所有内容,但正则表达式或其他东西不起作用。我用当前代码得到的输出只是 []。所以我想知道我做错了什么?我有一段时间没有使用 urllib,所以很可能我错过了一些明显的东西。 Python 文件:

import urllib
import re

htmlfile=urllib.urlopen('IP of server')
htmltext=htmlfile.read()
regex="<body>(.+?)</body>"
pattern=re.compile(regex)
price=re.findall(pattern,htmltext)
print price 

HTML 文件:

<html>
    <body>
        This is a basic HTML file to try to get my python file to work...
    </body>
</html>

提前致谢!

. 不匹配换行符,除非您设置点匹配所有 s 修饰符:

re.compile('<body>(.+?)</body>', re.DOTALL)

这里有一些错误。您需要启用 dotall 修饰符,它强制点跨越换行符序列。至于以下包含编译的正则表达式和调用 findall 的行,它应该是:

regex = "<body>(.+?)</body>"
pattern = re.compile(regex, re.DOTALL)
price = pattern.findall(htmltext)

可以简化如下,我建议丢弃匹配结果中的空格。

price = re.findall(r'(?s)<body>\s*(.+?)\s*</body>', htmltext)

为了将来参考,请使用 BeautifulSoup 等解析器而不是正则表达式来提取数据。

或者,实际上这个 should be preferred to regex-based approach - 使用 HTML 解析器.

示例(使用 BeautifulSoup):

>>> from bs4 import BeautifulSoup
>>> 
>>> data = """
... <html>
...     <body>
...         This is a basic HTML file to try to get my python file to work...
...     </body>
... </html>
... """
>>> soup = BeautifulSoup(data)
>>> print soup.body.get_text(strip=True)
This is a basic HTML file to try to get my python file to work...

请注意代码是多么简单,没有 "regex magic"。