【问题标题】:issue scraping all Row Data with Beautiful Soup使用 Beautiful Soup 抓取所有行数据的问题
【发布时间】:2017-07-11 14:25:26
【问题描述】:

这里对 BS4 比较陌生

我有以下 HTML(为简洁起见,URL 被截断):

    <tbody>
              <tr>
                <th >Part1</th>
                <td>
                  <a href="http://somewebpage.com">87</a>
</td>
                <td>
                  <a href="http://somewebpage.com">7</a>
                </td>
                <th>Part2</th>
                <td>
                  <a href="http://somewebpage.com"">68</a>
                </td>........

使用以下内容:

`soup=BeautifulSoup(page['content'], "html.parser")
 table = soup.find("table")
 table_data = [[cell.text for cell in row("td")]
 for row in table("tr")]
 pprint(table_data) `

table_data 如下所示:

    [[],
 [u'87', u'7'],
 [u'68'],

如何让“Part1”和“Part2”出现在同一个列表中??

很抱歉给您带来麻烦 ;-)

预期输出:

[[],
     [u'Part1',u'87', u'7'],
     [u'Part2',  u'68'],

【问题讨论】:

  • 请在您的问题上使用edit 链接添加预期输出
  • 使用这个:row(["td", "th"])
  • 谢谢,但是我正在寻找以下输出(如果我第一次添加会有所帮助,抱歉)
  • @MattA 请分享完整的表结构。或至少几个表格行。 &lt;tr&gt;

标签: python beautifulsoup


【解决方案1】:

您的表格结构不正确。请按照以下格式正确构建表格:https://www.w3schools.com/tags/tag_thead.asp

想象一下,如果您的表格是这样的结构:

content = """<table>
 <thead>
  <tr>
     <th>Month</th>
     <th>Savings</th>
  </tr>
 </thead>
 <tfoot>
  <tr>
     <td>Sum</td>
     <td>$180</td>
  </tr>
 </tfoot>
 <tbody>
  <tr>
     <td>January</td>
     <td>$100</td>
  </tr>
  <tr>
     <td>February</td>
     <td>$80</td>
  </tr>
 </tbody>
</table>"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(content, "html.parser")
table = soup.find("table")

print([header.text for header in soup.find("table").find("thead").find_all("th")])

for row in soup.find("table").find("tbody").find_all("tr"):
    print([data.text for data in row.find_all("td")])

print([footer.text for footer in soup.find("table").find("tfoot").find_all("td")])

输出

['Month', 'Savings']
['January', '$100']
['February', '$80']
['Sum', '$180']

【讨论】:

  • 嗨,我无法控制表格的结构
【解决方案2】:

如果您的“表格数据如下所示:”部分是您想要的值,而您只是想“展平”列表,请尝试:

2d_list = [[], [u'87', u'7'], [u'68']]

1d_list = [x for y in 2d_list for x in y]

导致:[u'87, u'7', u'68']

【讨论】:

  • 我想要实现:['Part1',u'87',u'7',u'68'],['part2',u'68']..... .
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 2019-12-23
  • 2020-07-27
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多