【问题标题】:Obtaining \r\n\r\n while scraping from web in Python在 Python 中从 Web 抓取时获取 \r\n\r\n
【发布时间】:2021-01-04 22:01:01
【问题描述】:

我正在使用 Python 从链接中抓取文本; tournament link

这是我获取表格数据的代码;

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
from urllib.request import urlopen
from bs4 import BeautifulSoup

url = "http://www.hubertiming.com/results/2017GPTR10K"
html = urlopen(url)
soup = BeautifulSoup(html, 'lxml')
rows = soup.find_all('tr') ## find the table rows

现在,目标是获取数据作为数据框。

listnew=[]
for row in rows:
    row_td = row.find_all('td')
    str_cells = str(row_td)
    cleantext = BeautifulSoup(str_cells, "lxml").get_text() ##obtain text part
    listnew.append(cleantext) ## append to list

df = pd.DataFrame(listnew)
df.head(10)

然后我们得到以下输出;

0   []
1   [Finishers:, 577]
2   [Male:, 414]
3   [Female:, 163]
4   []
5   [1, 814, \r\n\r\n JARED WIL...
6   [2, 573, \r\n\r\n NATHAN A ...
7   [3, 687, \r\n\r\n FRANCISCO...
8   [4, 623, \r\n\r\n PAUL MORR...
9   [5, 569, \r\n\r\n DEREK G O..

不知道为什么会有换行符和回车符; \r\n\r\n?如何删除它们并获得正确格式的数据框?提前致谢。

【问题讨论】:

  • 您能分享一下您的imports,urlopen 究竟来自哪里?
  • 请查看编辑。我确实添加了import 语句。
  • 你知道如何从字符串中删除字符吗?
  • 嗨,如果你想成为一个纯粹主义者并且不使用任何额外的库,你可以在数组元素 ant 上调用 .strip() 以去除字符串开头和结尾的空白和不可打印字符跨度>

标签: python pandas web-scraping


【解决方案1】:

Pandas 可以解析 HTML 表格,试试这个:

from urllib.request import urlopen

import pandas as pd
from bs4 import BeautifulSoup

url = "http://www.hubertiming.com/results/2017GPTR10K"
html = urlopen(url)
soup = BeautifulSoup(html, 'lxml')

table_1_html = soup.find('table', attrs={'id': 'individualResults'})

t_1 = pd.read_html(table_1_html.prettify())[0]

print(t_1)

输出:

     Place  Bib                Name  ... Chip Pace Gun Time          Team
0        1  814        JARED WILSON  ...      5:51    36:24           NaN
1        2  573  NATHAN A SUSTERSIC  ...      5:55    36:45  INTEL TEAM F
2        3  687      FRANCISCO MAYA  ...      6:05    37:48           NaN
3        4  623         PAUL MORROW  ...      6:13    38:37           NaN
4        5  569     DEREK G OSBORNE  ...      6:20    39:24  INTEL TEAM F
..     ...  ...                 ...  ...       ...      ...           ...
572    573  273      RACHEL L VANEY  ...     15:51  1:38:34           NaN
573    574  467      ROHIT B DSOUZA  ...     15:53  1:40:32  INTEL TEAM I
574    575  471      CENITA D'SOUZA  ...     15:53  1:40:34           NaN
575    576  338      PRANAVI APPANA  ...     16:15  1:42:01           NaN
576    577  443    LIBBY B MITCHELL  ...     16:20  1:42:10           NaN

[577 rows x 10 columns]

【讨论】:

    【解决方案2】:

    似乎 HTML 代码中的某些单元格有很多前导和尾随空格以及换行符:

    <td>
    
                        JARED WILSON
    
                    </td>
    

    使用str.strip 删除所有前导和尾随空格,如下所示: BeautifulSoup(str_cells, "lxml").get_text().strip().

    【讨论】:

    • 如果中间还有多余的空格,可以进行正则替换; WHITESPACE = re.compile(r'\s+') 在顶部,然后 text = WHITESPACE.sub(' ', text.strip()) 在循环中。
    • WHITESPACE.sub(' ', text) 似乎可以解决问题。字符串[577, 443, \r\n\r\n LIBBY B MITCHELL\r\n\r\n , F, HILLSBORO, OR, 1:41:18, 16:20, 1:42:10, ] 被转换为'[577, 443, LIBBY B MITCHELL , F, HILLSBORO, OR, 1:41:18, 16:20, 1:42:10, ]'
    • @sabik 感谢您的建议。看来WHITESPACE.sub(' ', text.strip()) 似乎正在工作。我可以知道它是如何工作的。它会帮助我学习某事。谢谢
    • 对,我的意思是在拆分行后应用它,以处理名称中间可能出现的额外空格/换行符(如LIBBY\r\nB\r\nMITCHELL)。
    • 它是如何工作的 - 这是一个regex 替换; \s+ 表示“任意数量的空白”(\s 表示空白,+ 表示一个或多个)。 sub() 方法会进行搜索和替换,因此它会搜索“任意数量的空格”并将它们中的每一个替换为一个空格。 .compile() 是一种优化,将\s+ 转换为内部形式以加快处理速度;没有它,它将是:text = re.sub(r'\s+', ' ', text.strip())
    【解决方案3】:

    看看你提供的网址,你可以看到新的行:

    ...
    <td>814</td>
    <td>
    JARED WILSON
    </td>
    ...
    

    所以这就是你在刮擦时得到的。这些可以通过非常方便的.strip() 字符串方法轻松删除。

    您的 DataFrame 格式不正确,因为您为其提供了一个列表列表,这些列表的大小并不相同(请参见前 4 行),这些列表来自位于右上角的另一个表。一个简单的解决方法是删除前 4 行,尽管根据表的 id ("individualResults") 选择所需的表会更加可靠。

    df = pd.DataFrame(listnew[4:])
    df.head(10)
    

    看看这里:BeautifulSoup table to dataframe

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 2020-01-09
      • 2021-06-08
      • 1970-01-01
      相关资源
      最近更新 更多