我有一个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>
提前感谢一大堆!
答案 0 :(得分:2)
这里有些不对劲。您需要启用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等解析器来提取数据而不是正则表达式。
答案 1 :(得分:2)
或者,实际上这个should be preferred to regex-based approach - 使用 HTML Parser 。
示例(使用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...
请注意代码是多么简单,没有&#34; regex magic&#34;。
答案 2 :(得分:1)
点.
与换行符不匹配,除非您设置了dot-matches-all s
修饰符:
re.compile('<body>(.+?)</body>', re.DOTALL)