标题:html如何读取空元素
只看楼主
huangyz_xy
Rank: 2
等 级:论坛游民
帖 子:101
专家分:30
注 册:2016-10-2
结帖率:77.78%
已结贴  问题点数:20 回复次数:6 
html如何读取空元素
<tr><td></td><td>abcd</td><td></td><td>0</td><td>0</td><td>0</td><td>3404</td><td>0</td><td>0</td><td>0</td><td>0</td></tr>
用rows.xpath(".//td//text()")方法解析出来的值为['abcd', '0', '0', '0', '70', '0', '0', '0', '0'],很明显确实了两列,有什么办法将标红的地方也解析出来,用其他的字符串代替,成为一个完成的列表?我的最终目的是要将整个写入到dataframe,如果不把缺失列列出来就会错乱(数据了有点大,近100万行,同时要考虑内存开销)。请各位大佬帮帮忙,谢谢!
搜索更多相关主题的帖子: 解析 元素 读取 html 写入 
2020-09-07 08:08
豆豆的滴
Rank: 9Rank: 9Rank: 9
来 自:湖南
等 级:贵宾
威 望:33
帖 子:368
专家分:1087
注 册:2018-5-7
得分:10 
程序代码:
import re
a="<tr><td></td><td>abcd</td><td></td><td>0</td><td>0</td><td>0</td><td>3404</td><td>0</td><td>0</td><td>0</td><td>0</td></tr>"
pattern=r'<td>(.*?)</td>'
test=re.findall(pattern,a)
print test

直接正则呢)
2020-09-07 11:28
fall_bernana
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:17
帖 子:240
专家分:2086
注 册:2019-8-16
得分:10 
以下是引用huangyz_xy在2020-9-7 08:08:54的发言:

<tr><td></td><td>abcd</td><td></td><td>0</td><td>0</td><td>0</td><td>3404</td><td>0</td><td>0</td><td>0</td><td>0</td></tr>
用rows.xpath(".//td//text()")方法解析出来的值为['abcd', '0', '0', '0', '70', '0', '0', '0', '0'],很明显确实了两列,有什么办法将标红的地方也解析出来,用其他的字符串代替,成为一个完成的列表?我的最终目的是要将整个写入到dataframe,如果不把缺失列列出来就会错乱(数据了有点大,近100万行,同时要考虑内存开销)。请各位大佬帮帮忙,谢谢!


程序代码:
from lxml import etree
text = '''
<tr><td></td><td>abcd</td><td></td><td>0</td><td>0</td><td>0</td><td>3404</td><td>0</td><td>0</td><td>0</td><td>0</td></tr>
'''
html = etree.HTML(text)
results = list(map(lambda x: x.xpath(".//text()"),html.xpath(".//td")))
print(results)


[[], ['abcd'], [], ['0'], ['0'], ['0'], ['3404'], ['0'], ['0'], ['0'], ['0']]
2020-09-07 12:25
huangyz_xy
Rank: 2
等 级:论坛游民
帖 子:101
专家分:30
注 册:2016-10-2
得分:0 
回复 2楼 豆豆的滴
行数很多,rows = doc.xpath('.//tr')出来的是n个lxml.etree._Element对象,我发帖的是一个copy出来的字符串,我想办法变换,始终不得法,我不想用etree.tostring先转换,这样内存开销受不了,还得继续请教!
2020-09-07 13:40
huangyz_xy
Rank: 2
等 级:论坛游民
帖 子:101
专家分:30
注 册:2016-10-2
得分:0 
回复 3楼 fall_bernana
行数很多,rows = doc.xpath('.//tr')出来的是n个lxml.etree._Element对象,我发帖的是一个copy出来的字符串,我想办法变换,始终不得法,我不想用etree.tostring先转换,这样内存开销受不了,还得继续请教!
这是我最终的想法:
            htmlf = open(file).read()
            doc = etree.HTML(htmlf)
            rows = doc.xpath('.//tr')
            header = rows[0].xpath(".//th/text()")
            data = [i.xpath(".//td/text()") for i in rows[1:]]
            df = TextParser(data, names=header).get_chunk()
这段代码就把空值直接干掉了,就会出现少列的现象
2020-09-07 13:43
huangyz_xy
Rank: 2
等 级:论坛游民
帖 子:101
专家分:30
注 册:2016-10-2
得分:0 
回复 2楼 豆豆的滴
发现个问题,
<tr><td>2020-09-03</td><td>CQCMLHC156025A</td><td>1350</td><td>4600-233233-1</td><td>HC</td><td>0</td><td>0</td><td>0</td><td/><td>0</td><td>0</td><td>0</td><td/><td>0</td><td>0</td><td>0</td><td/><td>0</td><td>0</td><td>0</td><td/></tr>
用print(etree.tostring(rows[1], encoding="utf-8").decode())打印出来标红地方源文件都是完整的标准节点<td></td>,应该是etree.HTML转换后将空值的地方全部变成了<td/>,难怪一直不行,可有什么办法?
2020-09-07 18:02
huangyz_xy
Rank: 2
等 级:论坛游民
帖 子:101
专家分:30
注 册:2016-10-2
得分:0 
解决了,将<td/>替换成<td></td>就行了,感谢豆豆的滴和fall_bernana!
2020-09-08 10:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-503085-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.096582 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved