我试图从一些网页上得到干净的文本。
我读了很多教程,最后得到了pythonlxml
+beautifulsoup
+requests
模块。
在这样一个任务中使用lxml
的原因是它比beautifulsoup更能清理html文件。在
我最终得到了这样的测试脚本:
from bs4 import UnicodeDammit
import re
import requests
import lxml
import lxml.html
from time import sleep
urls = [
"http://mathprofi.ru/zadachi_po_kombinatorike_primery_reshenij.html",
"http://ru.onlinemschool.com/math/assistance/statistician/",
"http://mathprofi.ru/zadachi_po_kombinatorike_primery_reshenij.html",
"http://universarium.org/courses/info/332",
"http://compsciclub.ru/course/wordscombinatorics",
"http://ru.onlinemschool.com/math/assistance/statistician/",
"http://lectoriy.mipt.ru/course/Maths-Combinatorics-AMR-Lects/",
"http://www.youtube.com/watch?v=SLPrGWQBX0I"
]
def check(url):
print "That is url {}".format(url)
r = requests.get(url)
ud = UnicodeDammit(r.content, is_html=True)
content = ud.unicode_markup.encode(ud.original_encoding, "ignore")
root = lxml.html.fromstring(content)
lxml.html.etree.strip_elements(root, lxml.etree.Comment,
"script", "style")
text = lxml.html.tostring(root, method="text", encoding=unicode)
text = re.sub('\s+', ' ', text)
print "Text type is {}!".format(type(text))
print text[:200]
sleep(1)
if __name__ == '__main__':
for url in urls:
check(url)
inertmediate需要对原始编码进行反编码和重新编码,因为html页面可能包含一些与大多数其他字符编码不同的字符。这种情况进一步打破了lxmltostring
方法。在
然而,我的代码并不是所有测试都能正常工作。有时(尤其是最后两个url)它会输出混乱的结果:
^{pr2}$这种混乱与编码ISO-8859-1
有关,但我不知道是怎么回事。
对于最后两个URL,我得到:
In [319]: r = requests.get(urls[-1])
In [320]: chardet.detect(r.content)
Out[320]: {'confidence': 0.99, 'encoding': 'utf-8'}
In [321]: UnicodeDammit(r.content, is_html=True).original_encoding
Out[321]: 'utf-8'
In [322]: r = requests.get(urls[-2])
In [323]: chardet.detect(r.content)
Out[323]: {'confidence': 0.99, 'encoding': 'utf-8'}
In [324]: UnicodeDammit(r.content, is_html=True).original_encoding
Out[324]: u'utf-8'
所以我猜lxml
基于对输入字符串的错误假设进行内部解码。我认为它甚至不想猜测输入字符串编码。在lxml的核心似乎发生了这样的事情:
In [339]: print unicode_string.encode('utf-8').decode("ISO-8859-1", "ignore")
ÑÑÑока
我如何解决我的问题,并从html标记中清除所有url? 也许我应该使用另一个python模块,或者用另一种方法? 请给我你的建议。在
我终于明白了。 解决办法是不使用
但是配置一个显式解析器对象,它可以被告知使用特定的编码
^{pr2}$enc
:另外,我发现即使
UnicodeDammit
在决定页面编码时也会犯明显的错误。因此,我添加了另一个if
块:以下是结果片段:
相关问题 更多 >
编程相关推荐