iay*_*ork 8 python beautifulsoup pandas
我有一个来自网络的大表,通过请求访问并使用BeautifulSoup解析.部分内容如下所示:
<table>
<tbody>
<tr>
<td>265</td>
<td> <a href="/j/jones03.shtml">Jones</a>Blue</td>
<td>29</td>
</tr>
<tr >
<td>266</td>
<td> <a href="/s/smith01.shtml">Smith</a></td>
<td>34</td>
</tr>
</tbody>
</table>
当我使用pd.read_html(tbl)输出将其转换为pandas时是这样的:
    0    1          2
 0  265  JonesBlue  29
 1  266  Smith      34
我需要将信息保留在<A HREF ... >标记中,因为唯一标识符存储在链接中.也就是说,该表应如下所示:
    0    1        2
 0  265  jones03  29
 1  266  smith01  34
我对各种其他输出都很好(例如,jones03 Jones会更有帮助),但唯一ID是至关重要的.  
其他单元格中也有html标签,一般情况下我不希望保存这些标签,但如果这是获取uid的唯一方法我可以保留这些标签并在以后清理它们,如果我必须.
有没有一种简单的方法来访问这些信息?
您可以像这样手动解析表:
import BeautifulSoup
import pandas as pd
TABLE = """<table>
<tbody>
<tr>
<td>265</td>
<td <a href="/j/jones03.shtml">Jones</a>Blue</td>
<td >29</td>
</tr>
<tr >
<td>266</td>
<td <a href="/s/smith01.shtml">Smith</a></td>
<td>34</td>
</tr>
</tbody>
</table>"""
table = BeautifulSoup.BeautifulSoup(TABLE)
records = []
for tr in table.findAll("tr"):
    trs = tr.findAll("td")
    record = []
    record.append(trs[0].text)
    record.append(trs[1].a["href"])
    record.append(trs[2].text)
    records.append(record)
df = pd.DataFrame(data=records)
df
给你的
     0                 1   2
0  265  /j/jones03.shtml  29
1  266  /s/smith01.shtml  34
由于此解析作业需要提取文本和属性值,因此无法通过诸如此类的函数完全"开箱即用"
 pd.read_html.其中一些必须手工完成.
使用lxml,您可以使用XPath提取属性值:
import lxml.html as LH
import pandas as pd
content = '''
<table>
<tbody>
<tr>
<td>265</td>
<td> <a href="/j/jones03.shtml">Jones</a>Blue</td>
<td >29</td>
</tr>
<tr >
<td>266</td>
<td> <a href="/s/smith01.shtml">Smith</a></td>
<td>34</td>
</tr>
</tbody>
</table>'''
table = LH.fromstring(content)
for df in pd.read_html(content):
    df['refname'] = table.xpath('//tr/td/a/@href')
    df['refname'] = df['refname'].str.extract(r'([^./]+)[.]')
    print(df)
产量
     0          1   2  refname
0  265  JonesBlue  29  jones03
1  266      Smith  34  smith01
上面的内容可能很有用,因为它只需要几行额外的代码来添加refname列.
但两者LH.fromstring并pd.read_html解析HTML.因此,通过以下方式删除pd.read_html和解析表,可以提高效率LH.fromstring:
table = LH.fromstring(content)
# extract the text from `<td>` tags
data = [[elt.text_content() for elt in tr.xpath('td')] 
        for tr in table.xpath('//tr')]
df = pd.DataFrame(data, columns=['id', 'name', 'val'])
for col in ('id', 'val'):
    df[col] = df[col].astype(int)
# extract the href attribute values
df['refname'] = table.xpath('//tr/td/a/@href')
df['refname'] = df['refname'].str.extract(r'([^./]+)[.]')
print(df)
产量
    id        name  val  refname
0  265   JonesBlue   29  jones03
1  266       Smith   34  smith01
| 归档时间: | 
 | 
| 查看次数: | 14747 次 | 
| 最近记录: |