Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 提取HTML文件中的特定元素并插入CSV_Python_Html_Csv_Beautifulsoup_Pycharm - Fatal编程技术网

Python 提取HTML文件中的特定元素并插入CSV

Python 提取HTML文件中的特定元素并插入CSV,python,html,csv,beautifulsoup,pycharm,Python,Html,Csv,Beautifulsoup,Pycharm,我有一个HTML表存储在一个文件中。我想从具有如下属性的表中获取每个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="

我有一个HTML表存储在一个文件中。我想从具有如下属性的表中获取每个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>
CSV4的值将被忽略,如“网格1-2”所述,而不是“网格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
我现在做了什么蠢事

谢谢:)


如果结果是列表中的字符串,则需要将其包装在列表中,因为writerows需要一个iterable的iterable并在字符串上迭代:

a.writerows([result]) <- wrap in a list 

结果列表中包含所有td标记,因此只需使用.text提取文本。

如果结果是列表中的字符串,则需要将其包装在列表中,因为writerows需要一个iterable的iterable并在字符串上迭代:

a.writerows([result]) <- wrap in a list 

您的结果列表中有所有td标记,因此只需使用.text提取文本。

使用
lxml
csv
模块

  • 通过lxml的
    xpath()
    方法获取所有
    td
    文本值,其中属性
    descripibedby
    具有值
    grid\u 1-1
  • 以写入模式打开
    csv
    文件
  • 通过
    writerow()
    方法将行写入csv文件
  • 代码:


    使用
    lxml
    csv
    模块

  • 通过lxml的
    xpath()
    方法获取所有
    td
    文本值,其中属性
    descripibedby
    具有值
    grid\u 1-1
  • 以写入模式打开
    csv
    文件
  • 通过
    writerow()
    方法将行写入csv文件
  • 代码:


    如果使用
    writerows
    ,我认为它必须是
    a.writerows([[result]])
    ,因为该方法需要一个iterable的iterable。非常感谢大家。这似乎打印出了完整的、所有的属性和内容。有没有办法只打印内容?@SimonKiely,您需要从元素中提取所需内容。在本例中,是Iimagine@SimonKiely,
    结果。文本应提取text@rchang,是的,但我认为在这种情况下,writerow是正确的用法。如果使用
    writerows
    ,我认为它必须是
    a.writerows([[结果]])
    因为该方法需要一个iterable。非常感谢。这似乎打印出了完整的、所有的属性和内容。有没有办法只打印内容?@SimonKiely,您需要从元素中提取所需内容。在本例中,text是Iimagine@SimonKiely,
    结果。文本应提取text@rchang,是的,但我认为在这种情况下writerow是正确的使用方法。这将发现所有的td不仅仅是相关的,OP已经在结果中有了标签list@PadraicCunningham:是正确的。OP有标签。(使用
    descripebby='grid\u 1-1'
    获得
    td
    s的正确代码)这将发现所有的td不仅仅是相关的,OP在结果中已经有了标签list@PadraicCunningham:是正确的。OP有标签。(使用
    descripebby='grid\u 1-1'
    获得
    td
    s的正确代码)
    a.writerows([result]) <- wrap in a list 
    
      a.writerow([result.text]) # write the text from td element
    
    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