Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 3.x 如何使用Python csv仅为两个特定列编写多个beautifulsoup表行?_Python 3.x_Csv_Web Scraping_Beautifulsoup_Export To Csv - Fatal编程技术网

Python 3.x 如何使用Python csv仅为两个特定列编写多个beautifulsoup表行?

Python 3.x 如何使用Python csv仅为两个特定列编写多个beautifulsoup表行?,python-3.x,csv,web-scraping,beautifulsoup,export-to-csv,Python 3.x,Csv,Web Scraping,Beautifulsoup,Export To Csv,我想使用beautifulsoup来刮除HTML,以便从一个表中的每一行中仅拉出两列。但是,每一“tr”行有10个“td”单元,我只需要每一行中的[1]和[8]个“td”单元。做这件事最像蟒蛇的方式是什么 根据下面的输入,我得到了一个表、一个主体、三行和每行10个单元格 输入 您应该能够使用css选择器 from bs4 import BeautifulSoup as bs import pandas as pd html = 'actualHTML' soup = bs(html, 'lxm

我想使用beautifulsoup来刮除HTML,以便从一个表中的每一行中仅拉出两列。但是,每一“tr”行有10个“td”单元,我只需要每一行中的[1]和[8]个“td”单元。做这件事最像蟒蛇的方式是什么

根据下面的输入,我得到了一个表、一个主体、三行和每行10个单元格

输入

您应该能够使用css选择器

from bs4 import BeautifulSoup as bs
import pandas as pd
html = 'actualHTML'
soup = bs(html, 'lxml')
results = []
for row in soup.select('#tblMain tr'):
    out_row = [item.text.strip() for item in row.select('td:nth-of-type(2), td:nth-of-type(9)')]
    results.append(out_row)
df = pd.DataFrame(results)
print(df)
df.to_csv(r'C:\Users\User\Desktop\data.csv', sep=',', encoding='utf-8-sig',index = False )

每当我需要拉一个表,并且它有
标记时,我会让Pandas为我做这项工作,然后只需手动上传它返回的数据帧(如果需要)。这就是我在这里要做的:

html = '''<table id ="tblMain">
 <tbody>
  <tr>
   <td> text</td>
   <td> data1</td>
   <td> text</td>
   <td> text</td>
   <td> text</td>
   <td> text</td>
   <td> text</td>
   <td> text</td>
   <td> data2</td>
   <td> text</td>
  <tr>
   <td> text</td>
   <td> data1</td>
   <td> text</td>
   <td> text</td>
   <td> text</td>
   <td> text</td>
   <td> text</td>
   <td> text</td>
   <td> data2</td>
   <td> text</td>
  <tr>
   <td> text</td>
   <td> data1</td>
   <td> text</td>
   <td> text</td>
   <td> text</td>
   <td> text</td>
   <td> text</td>
   <td> text</td>
   <td> data2</td>
   <td> text</td>'''


import pandas as pd

# .read_html() returns a list of dataframes
tables = pd.read_html(html)[0]

# we want the dataframe from that list in position [0]
df = tables[0]

# Use .iloc to say I want all the rows, and columns 1, 8
df = df.iloc[:,[1,8]]

# Write the dataframe to file
df.to_csv('path.filename.csv', index=False)
html=''
文本
数据1
文本
文本
文本
文本
文本
文本
数据2
文本
文本
数据1
文本
文本
文本
文本
文本
文本
数据2
文本
文本
数据1
文本
文本
文本
文本
文本
文本
数据2
文本''
作为pd进口熊猫
#.read_html()返回数据帧列表
tables=pd.read\u html(html)[0]
#我们希望该列表中的数据帧位于位置[0]
df=表[0]
#使用.iloc表示我想要所有的行和列1、8
df=df.iloc[:,[1,8]]
#将数据帧写入文件
df.to_csv('path.filename.csv',index=False)
你几乎做到了

for row in rows:
    row = row.findAll("td")
    csv_row = [row[1].get_text(), row[8].get_text()]
    writer.writerow(csv_row)
完整代码

html ='''<table id ="tblMain">
 <tbody>
  <tr>
   <td>text</td>
   <td>data1</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>data2</td>
   <td>text</td>
  <tr>
   <td>text</td>
   <td>data1</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>data2</td>
   <td>text</td>
  <tr>
   <td>text</td>
   <td>data1</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>data2</td>
   <td>text</td>
'''

from bs4 import BeautifulSoup
import csv

soup = BeautifulSoup(html, 'html.parser')

table = soup.find('table', {'id':'tblMain'} )
table_body = table.find('tbody')

rows = table_body.findAll('tr')

reportname = 'output'
filename = '%s.csv' % reportname

with open(filename, "wt+", newline="") as f:
    writer = csv.writer(f)
    for row in rows:
        row = row.findAll("td")
        csv_row = [row[1].get_text(), row[8].get_text()]
        writer.writerow(csv_row)
html=''
文本
数据1
文本
文本
文本
文本
文本
文本
数据2
文本
文本
数据1
文本
文本
文本
文本
文本
文本
数据2
文本
文本
数据1
文本
文本
文本
文本
文本
文本
数据2
文本
'''
从bs4导入BeautifulSoup
导入csv
soup=BeautifulSoup(html,'html.parser')
table=soup.find('table',{'id':'tblMain'})
table_body=table.find('tbody'))
行=表体.findAll('tr')
reportname='输出'
文件名=“%s.csv”%reportname
打开(文件名为“wt+”,换行为“”)作为f:
writer=csv.writer(f)
对于行中的行:
row=row.findAll(“td”)
csv_行=[行[1]。获取_文本(),行[8]。获取_文本()
writer.writerow(csv_行)

row=row.findAll(“td”)
writer.writerow([row[1],row[8])
非常感谢您的帮助。尽管如此,我并没有很好地听从你的建议。你到底建议我用row=row.findAll(“td”)替换什么?替换你所有的
行中的行:
html ='''<table id ="tblMain">
 <tbody>
  <tr>
   <td>text</td>
   <td>data1</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>data2</td>
   <td>text</td>
  <tr>
   <td>text</td>
   <td>data1</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>data2</td>
   <td>text</td>
  <tr>
   <td>text</td>
   <td>data1</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>text</td>
   <td>data2</td>
   <td>text</td>
'''

from bs4 import BeautifulSoup
import csv

soup = BeautifulSoup(html, 'html.parser')

table = soup.find('table', {'id':'tblMain'} )
table_body = table.find('tbody')

rows = table_body.findAll('tr')

reportname = 'output'
filename = '%s.csv' % reportname

with open(filename, "wt+", newline="") as f:
    writer = csv.writer(f)
    for row in rows:
        row = row.findAll("td")
        csv_row = [row[1].get_text(), row[8].get_text()]
        writer.writerow(csv_row)