作者st1009 (前端攻城师)
看板Python
标题[问题] 大型xml没有根如何处理?
时间Sun May 13 23:44:02 2018
各位大大晚安,不才想请教两个问题<(_ _)>
我目前希望可以处理一份很巨大的xml,但是我手上的xml档没有树根!
经过测试我发现会报错QAQQQ
我看到别人的解法好像是先把档案开启来,然後写入树根?
但是我目前需要动态迭代,因为档案很大,无法一次存入记忆体,
我试着引用查到的程式码,我的程式目前长如下网址
http://codepad.org/bPqMyuly
感觉好像不适合用那种open然後加入树根的方式,不知道版上大大有好建议嘛?
譬如怎麽跟着迭代动态写入树根?
我的XML格式如下:
<doc id="13" url="https:XXX" title="XX">
content 1
</doc>
<doc id="15" url="https:XXX" title="XX">
content 2
</doc>
另外想问我希望搜寻文档中xml的content,然後如果我的keyword有出现在content中,
就回报我content的id,让我知道哪些content中有出现我的keyword,
我操作如下
先把xml分析出id和content之後,存入MySQL资料库,
再藉由SELECT id FROM table WHERE content = "%keyword%"
找出哪些文章出现我的关键字
这样子的操作会有问题嘛?譬如MySQL会搜很慢之类的?
如果有问题,我怎样做比较好?
p.s我的关键字都是中文
--
半壁河山半攻守
半争成败半悟道
许银川
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.163.141.34
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1526226246.A.D68.html
1F:→ ThxThx: 一行一行读 05/14 01:43
2F:→ ThxThx: 读到close tag 就把累积的内容拿去parse 05/14 01:43
这样听起来,我需要自己用正规表达式判断是不是close tag,不能用现成套件Q
不是很擅长正规表达式的说QAQ
3F:→ s860134: 你的问题应该是在档案太大,写入 sql 很好阿 05/14 12:58
4F:→ s860134: 後来网路上有人提示 etree.HTML 就可已爬没 root 的 05/14 13:07
6F:→ s860134: 你直接当作 html 爬应该是没什麽差 05/14 13:08
其实我有看到下面写html,但是我试着导入HTML之後,进行迭代依旧出错,
所以在想是不是html版并无迭代功能,当然也可能是我自己用错了>"<
待我研究一下此版本是否可以迭代运算,不然档案太大会吃不下,要边吃边释放
8F:→ subi: 我觉得你应该搭配 generator 来写,可以避免记忆体问题 05/14 21:11
好,我研究一下,html系列好像真的没有iterparse函式,
有没有其他相应函式我不清楚...
我研究一下generator,刚刚直接执行,电脑差点当掉,还好我即时喊停>"<
不太清楚generator要如何搭配QAQQQ
您给予的程式在我稍做修改,加入正式大量数据时就会造成电脑当机
当在执行soap = BeautifulSoup(file, "lxml")
我猜测再这一步运行时,就会需要将整个档案导入,所以记忆体无法负荷,
而generator好像是在这步之後的步骤?
怪怪的刚刚想贴程式码再测试时结果不一样了,没有当,但是只有输出一笔
然後soap = BeautifulSoup(fn, "lxml") 这边卡了很久
http://codepad.org/iLwM633k
#
阿阿,我崩溃了╯-____-)╯~═╩════╩═~
开了很久,手动加上root结果还是爆了,这不是那麽乾净的xml
直接把档案丢上来好了...
我发现BeautifulSoup在比较小那份可以跑,但是他默默的没有跑完就停了...
之後可能考虑真的一行一行读吧
https://drive.google.com/drive/folders/
1hWUIROmnJE-GuSxc2079JmRwMF-zbQ9g?usp=sharing
短网址:
https://goo.gl/X2seS3
10F:→ subi: 可以参考我上面贴的程式码,档案这麽大我觉得你用 lxml是对的 05/15 20:36
11F:→ subi: 跑一会有 EntityRef: expecting ';', line 2603, column 60 05/15 20:37
12F:→ subi: 这个你就自己解吧 XD 05/15 20:38
有大神远端帮忙解好了,感谢您 <3
秉持互助原则把大神写好的清理程式放上来
perl版
http://codepad.org/7BzB36yW
python版
http://codepad.org/FNZmO1pD
希望以後可以帮到更多需要的人^^
(大神如果您觉得不合适可以叫我撤下)
※ 编辑: st1009 (1.163.154.100), 05/16/2018 23:07:09