注册 登录
编程论坛 Python论坛

html如何读取空元素

huangyz_xy 发布于 2020-09-07 08:08, 2038 次点击
<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万行,同时要考虑内存开销)。请各位大佬帮帮忙,谢谢!
6 回复
#2
豆豆的滴2020-09-07 11:28
程序代码:
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

直接正则呢)
#3
fall_bernana2020-09-07 12:25
以下是引用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']]
#4
huangyz_xy2020-09-07 13:40
回复 2楼 豆豆的滴
行数很多,rows = doc.xpath('.//tr')出来的是n个lxml.etree._Element对象,我发帖的是一个copy出来的字符串,我想办法变换,始终不得法,我不想用etree.tostring先转换,这样内存开销受不了,还得继续请教!
#5
huangyz_xy2020-09-07 13:43
回复 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()
这段代码就把空值直接干掉了,就会出现少列的现象
#6
huangyz_xy2020-09-07 18:02
回复 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/>,难怪一直不行,可有什么办法?
#7
huangyz_xy2020-09-08 10:51
解决了,将<td/>替换成<td></td>就行了,感谢豆豆的滴和fall_bernana!
1