Mathematica 获取豆瓣图书top250,正则表达式

来源:互联网 发布:淘宝客服欢迎用语 编辑:程序博客网 时间:2024/04/27 17:06

mathematica的Import除了可以从文件中导入数据之外,还可以方便的从任何可访问的网页中导入数据,例如

Import["https://book.douban.com/top250"]

通过加入Elements,可以查看可用的元素

Import["https://book.douban.com/top250", "Elements"]{"Data", "FullData", "Hyperlinks", "ImageLinks", "Images", "Plaintext", "Source", "Title", "XMLObject"}

为了获取豆瓣图书的top250,我们需要解析它的html页面元素,因此

Import["https://book.douban.com/top250", "Source"]

这将得到一个html格式的源码(当然,你也可以通过浏览器查看源代码)

找到其中关键的一行

<a href="https://book.douban.com/subject/1770782/" onclick=&#34;moreurl(this,{i:&#39;0&#39;})&#34; title="追风筝的人"

这是一个超链接,里面含有书的标题以及对应页面,因此,我们需要从整个html中取出这些元素,注意,你的正则表达式应该尽量匹配这些元素,利用mathematica的StringCases,可以方便找到这些元素

dbhtml = Import["https://book.douban.com/top250?start=0", "Source"];list = StringCases[dbhtml, RegularExpression["<a href=\"https://book.douban.com/subject/.+\""]];

第一行,获取整个html页面,
第二行,取出href超链接
生成的是一个list,结果如下

"<a href=\"https://book.douban.com/subject/1770782/\" \onclick=&#34;moreurl(this,{i:&#39;0&#39;})&#34; title=\"追风筝的人\"", "<a \href=\"https://book.douban.com/subject/1084336/\" \onclick=&#34;moreurl(this,{i:&#39;1&#39;})&#34; title=\"小王子\"", "<a \href=\"https://book.douban.com/subject/1008145/\" \onclick=&#34;moreurl(this,{i:&#39;2&#39;})&#34; title=\"围城\"", "<a \href=\"https://book.douban.com/subject/25862578/\" \onclick=&#34;moreurl(this,{i:&#39;3&#39;})&#34; title=\"解忧杂货店\"", "<a \href=\"https://book.douban.com/subject/1082154/\" \onclick=&#34;moreurl(this,{i:&#39;4&#39;})&#34; title=\"活着\"", "<a \href=\"https://book.douban.com/subject/3259440/\" \onclick=&#34;moreurl(this,{i:&#39;5&#39;})&#34; title=\"白夜行\"",..........}

利用StringReplace替换规则,替换想要的结果

list = StringReplace[list,    RegularExpression[".+\"(.+)\".+\"(.+)\""] -> "-$1-$2"];

生成结果

{"-https://book.douban.com/subject/1770782/-追风筝的人", \"-https://book.douban.com/subject/1084336/-小王子", \"-https://book.douban.com/subject/1008145/-围城", \"-https://book.douban.com/subject/25862578/-解忧杂货店", \"-https://book.douban.com/subject/1082154/-活着", \"-https://book.douban.com/subject/3259440/-白夜行", \"-https://book.douban.com/subject/1046265/-挪威的森林", \"-https://book.douban.com/subject/3211779/-嫌疑人X的献身", \"-https://book.douban.com/subject/2567698/-三体", \"-https://book.douban.com/subject/1017143/-不能承受的生命之轻", \"-https://book.douban.com/subject/1007305/-红楼梦", \"-https://book.douban.com/subject/1016300/-梦里花落知多少", \"-https://book.douban.com/subject/1040771/-达\[CenterDot]芬奇密码", \"-https://book.douban.com/subject/20427187/-看见", \"-https://book.douban.com/subject/6082808/-百年孤独", \"-https://book.douban.com/subject/5275059/-1988:我想和这个世界谈谈", \"-https://book.douban.com/subject/1461903/-何以笙箫默", \"-https://book.douban.com/subject/1200840/-平凡的世界(全三部)", \"-https://book.douban.com/subject/1141406/-简爱", \"-https://book.douban.com/subject/1041007/-哈利\[CenterDot]波特与魔法石", \"-https://book.douban.com/subject/10554308/-白夜行", \"-https://book.douban.com/subject/3066477/-三体Ⅱ", \"-https://book.douban.com/subject/1068920/-飘", \"-https://book.douban.com/subject/4238362/-送你一颗子弹", \"-https://book.douban.com/subject/5363767/-三体Ⅲ"}

注意,以上仅仅只是一个页面(第一页),那么,如何进行翻页呢?
答案是显然的,你只需要将以上步骤写成一个函数,然后对于不同的页面进行调用即可

https://book.douban.com/top250?start=0https://book.douban.com/top250?start=25https://book.douban.com/top250?start=50https://book.douban.com/top250?start=75.......