查看原文
其他

走进图文并茂的攻略世界

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:石   艳,中南财经政法大学统计与数学学院

本文编辑:张孟晗

技术总编:陈   鼎

Stata&Python云端课程来啦!

为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦


导读
还记得之前的的云南旅游攻略爬取吗?我们当时只是获取到了作者、攻略标题还有相关链接等信息,并没有获得攻略的详细内容,那这篇文章就带大家获取详细内容。除此之外,像攻略这种图文并茂的信息,我们希望获得一个良好的阅读体验,而不是以纯文本的形式呈现,所以可以结合html2text库来将获取到的文本内容转化为markdown格式,那让我们开始吧!

1
获取文本内容
首先,我们以不久之前获取到的第一篇攻略为例(https://travel.qunar.com/youji/2773106),打开开发者模式,可以看到除标题外的全部内容都位于以<divid="b_panel_schedule">开头的标签内,可以直接利用text获取文本内容。

但是考虑到后期转化为Markdown格式的准确性,需要对这些文本进行初步的处理,程序如下:
import requestsfrom bs4 import BeautifulSoup
url = "https://travel.qunar.com/youji/2773106"headers = { 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36', }r = requests.get(url,headers=headers)r.recoding='utf8'
html=r.texthtml = html.replace("&nbsp;", "")html = html.replace("~~", "~").replace("~~", "~") #避免转换后的格式错误
bsObj = BeautifulSoup(html,'lxml')title = bsObj.find("h1").text # 标题content = bsObj.find("div",attrs = {"id":"b_panel_schedule"}) # 正文部分
此时可以看一下打印后的content,为了更方便地与进一步处理后的文本进行对比展示,特地标出了章节标题和第一张图片所在的位置,此时如果直接使用这样的文本进行html2text的转化便能得到一个较好的结果岂不是皆大欢喜,但是很遗憾,这样并不能很好的保留原来的图片和排版,还需要再接再厉啊!



2

保留原来排版

接下来就让我们再接再厉,通过一步步的调整,争取保留原来排版的完美转化吧。


2.1 图片格式调整

# 图片格式转换imgs = content.find_all("img")for img in imgs: src = img['data-original'] txt = img['title'] img.insert_after("![{0}]({1})".format(txt,src))    img.extract()

2.2 章节标题处理

header5 = content.find_all("h5")for h5 in header5: t5 = h5.find("div", attrs = {"class":"b_poi_title_box"}) h5.insert_after("##### " + t5.text)    h5.extract()
2.3 多余内容处理

除了图片和章节标题外,我们也发现有一些不必要的内容,比如“评论(1)”这样的文本,需要对这些文本进行舍弃。

#去掉不必要的内容 cmts = content.find_all("div", attrs = {"class":"ops"})for s in cmts: s.insert_after('< br/>')    s.extract()
在进行了上面三步之后,再次打印content,观察结果,在这次的结果中可以明显的看到章节标题的格式和图片的格式都发生了变化,更符合Markdown格式的要求,离目标又近了一步。



3
格式转换并保存
利用处理后的content转换为Markdown格式需要用到的库为html2text库,可以通过pip install html2text来进行安装,转换的代码如下:
import html2text as ht
text_maker = ht.HTML2Text()text = text_maker.handle(str(content))
# 对转换后的格式进一步调整,去掉一些特殊符号,比如多余的空格和文字等text = text.replace("#\n\n", "# ")text = text.replace("\\.",".")text = text.replace(".\n",". ")text = text.replace("< br/>","\n")text = text.replace("tr-\n","tr-")text = text.replace("查看全部 __","")
with open("./data" + title + ".md", 'w', encoding='utf-8') as f:    f.write(text)
转换后的Markdown呈现如下,我们可以尽享阅读的乐趣啦:


本篇文章只展示了首篇攻略的下载和格式转换,如果想一次性获取多篇,就可以把以上的处理过程改写成函数进行多次利用,在此我们展示一下第一页十篇攻略的获取结果,完整代码可回复“图文并茂的攻略”获得哦~


让我们慢慢进入这些攻略,或许可以找到更适合的规划路线,或许只是单纯的欣赏风景照片,但有所收获就已经足够!
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



欢迎大家点赞、转发、评论哦!

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐     

         玩转word文档“大变身”——wordconvert

        数据读入|一文读懂用Stata读入不同类型的数据

        简述递归

         OpenCV库——轻松更换证件照背景色

         800万年薪!还有谁?!

        千古伤心词人,词伤几何?

去哪儿网攻略爬取——跟我一起去大理吧

"有你才有团"——Stata爬取王者荣耀英雄海报

  爬虫实战|嚣张的徽州宴老板娘错在哪?

如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫

利用Python构建马科维茨有效边界

rangestat,让统计量灵活滚动起来!

听说这样做立项成功率更高哦

如何处理缺失值?这一篇搞定!

  善用dataex命令,高效沟通你我他

  用Markdown制作简历,强力助力你的求职季

大数据下的大学分数线排行榜,快来围观!

《觉醒年代》—带你回到百年前

用Stata画的三维图很奇怪怎么办?

如何随机生成满足特定数据特征的新变量?

爬取无法翻页网页——自然科学基金项目及可视化

爬取京东评论数据进行情感分类

Stata与音乐之间的酷炫连接

这些年,爬虫俱乐部走出的博士们!
         看这里,近五年各校高被引论文上榜名单!

高校经管类核心期刊发文排行榜

疯狂的科研创新加速器——Stata!

  可盐可甜,“粽”有所爱,快来pick你最爱的粽子吧!

  好玩有趣的手绘图形库——cutecharts

  爬虫实战|摩尔庄园微博话题讨论

  一季度财报出炉,哪些公司最烧钱?

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存