提取 HTML 文件中的特定元素并插入到 CSV 中
Extracting particular element in HTML file and inserting into CSV
我有一个 HTML table 存储在一个文件中。我想从具有如下属性的 table 中获取每个 td 值:
<td describedby="grid_1-1" ... >Value for CSV</td>
<td describedby="grid_1-1" ... >Value for CSV2</td>
<td describedby="grid_1-1" ... >Value for CSV3</td>
<td describedby="grid_1-2" ... >Value for CSV4</td>
我想将其放入 CSV 文件中,每个新值在 CSV 文件中占据一个新行。
因此对于上面的文件,生成的 CSV 将是:
Value for CSV
Value for CSV2
Value for CSV3
如="grid_1-2"所述,CSV4 值将被忽略,而不是"grid_1-1"。
所以我已经尝试过了,但是无论我尝试什么,似乎
(a) 每个打印行之间有一个空行
(b) 逗号分隔每个字符。
所以印刷品更像是:
V,a,l,u,e,f,o,r,C,S,V,
V,a,l,u,e,f,o,r,C,S,V,2
我现在做了什么傻事?
谢谢:)
import csv
import os
from bs4 import BeautifulSoup
with open("C:\Users\ADMIN\Desktop\test.html", 'r') as orig_f:
soup = BeautifulSoup(orig_f.read())
results = soup.findAll("td", {"describedby":"grid_1-1"})
with open('C:\Users\ADMIN\Desktop\Deploy.csv', 'wb') as fp:
a = csv.writer(fp, delimiter=',')
for result in results :
a.writerows(result)
如果结果是列表中的字符串,您需要将其包装在列表中,因为 writerows 需要可迭代的可迭代对象并遍历字符串:
a.writerows([result]) <- wrap in a list
在您的情况下,您应该使用 writerow 并从结果中的每个 td 标记中提取文本:
a.writerow([result.text]) # write the text from td element
您的结果列表中包含所有 td 标签,因此您只需要使用 .text 提取文本。
使用 lxml
和 csv
模块。
- 通过lxml的
xpath()
方法获取属性describedby
值为grid_1-1
的所有td
文本值。
- 以写入模式打开
csv
文件。
- 通过
writerow()
方法 写入csv文件行
代码:
content = """
<body>
<td describedby="grid_1-1">Value for CSV</td>
<td describedby="grid_1-1">Value for CSV2</td>
<td describedby="grid_1-1">Value for CSV3</td>
<td describedby="grid_1-2">Value for CSV4</td>
</body>
"""
from lxml import etree
import csv
root = etree.fromstring(content)
l = root.xpath("//td[@describedby='grid_1-1']/text()")
with open('/home/vivek/Desktop/output.csv', 'wb') as fp:
a = csv.writer(fp, delimiter=',')
for i in l :
a.writerow([i, ])
输出:
Value for CSV
Value for CSV2
Value for CSV3
Value for CSV4
我有一个 HTML table 存储在一个文件中。我想从具有如下属性的 table 中获取每个 td 值:
<td describedby="grid_1-1" ... >Value for CSV</td>
<td describedby="grid_1-1" ... >Value for CSV2</td>
<td describedby="grid_1-1" ... >Value for CSV3</td>
<td describedby="grid_1-2" ... >Value for CSV4</td>
我想将其放入 CSV 文件中,每个新值在 CSV 文件中占据一个新行。
因此对于上面的文件,生成的 CSV 将是:
Value for CSV
Value for CSV2
Value for CSV3
如="grid_1-2"所述,CSV4 值将被忽略,而不是"grid_1-1"。
所以我已经尝试过了,但是无论我尝试什么,似乎 (a) 每个打印行之间有一个空行 (b) 逗号分隔每个字符。
所以印刷品更像是:
V,a,l,u,e,f,o,r,C,S,V,
V,a,l,u,e,f,o,r,C,S,V,2
我现在做了什么傻事?
谢谢:)
import csv
import os
from bs4 import BeautifulSoup
with open("C:\Users\ADMIN\Desktop\test.html", 'r') as orig_f:
soup = BeautifulSoup(orig_f.read())
results = soup.findAll("td", {"describedby":"grid_1-1"})
with open('C:\Users\ADMIN\Desktop\Deploy.csv', 'wb') as fp:
a = csv.writer(fp, delimiter=',')
for result in results :
a.writerows(result)
如果结果是列表中的字符串,您需要将其包装在列表中,因为 writerows 需要可迭代的可迭代对象并遍历字符串:
a.writerows([result]) <- wrap in a list
在您的情况下,您应该使用 writerow 并从结果中的每个 td 标记中提取文本:
a.writerow([result.text]) # write the text from td element
您的结果列表中包含所有 td 标签,因此您只需要使用 .text 提取文本。
使用 lxml
和 csv
模块。
- 通过lxml的
xpath()
方法获取属性describedby
值为grid_1-1
的所有td
文本值。 - 以写入模式打开
csv
文件。 - 通过
writerow()
方法 写入csv文件行
代码:
content = """
<body>
<td describedby="grid_1-1">Value for CSV</td>
<td describedby="grid_1-1">Value for CSV2</td>
<td describedby="grid_1-1">Value for CSV3</td>
<td describedby="grid_1-2">Value for CSV4</td>
</body>
"""
from lxml import etree
import csv
root = etree.fromstring(content)
l = root.xpath("//td[@describedby='grid_1-1']/text()")
with open('/home/vivek/Desktop/output.csv', 'wb') as fp:
a = csv.writer(fp, delimiter=',')
for i in l :
a.writerow([i, ])
输出:
Value for CSV
Value for CSV2
Value for CSV3
Value for CSV4