【问题标题】:How to get the content from a certain <table> using python?如何使用 python 从某个 <table> 中获取内容?
【发布时间】:2012-10-02 12:31:37
【问题描述】:

我有一些&lt;tr&gt;s,像这样:

<tr align=center><td>10876151</td><td><a href=userstatus?user_id=yangfanhit>yangfanhit</a></td><td><a href=problem?id=3155>3155</a></td><td><font color=blue>Accepted</font></td><td>344K</td><td>219MS</td><td>C++</td><td>3940B</td><td>2012-10-02 16:42:45</td></tr>
<tr align=center><td>10876150</td><td><a href=userstatus?user_id=BandBandRock>BandBandRock</a></td><td><a href=problem?id=2503>2503</a></td><td><font color=blue>Accepted</font></td><td>16348K</td><td>2750MS</td><td>G++</td><td>840B</td><td>2012-10-02 16:42:25</td></tr>

我想获取不带html标签的内容,比如:

yangfanhit
3155
Accepted
344K
219MS
C++
3940B
2012-10-02 16:42:45

现在我使用下面的代码来处理它:

response = urllib2.urlopen('http://poj.org/status', timeout=10)
html = response.read()
response.close()

pattern = re.compile(r'<tr align.*</tr>')
match = pattern.findall(html)
pat = re.compile(r'<td>.*?</td>')
p = re.compile(r'<[/]?.*?>')
for item in match:
    for i in pat.findall(item):
        print p.sub(r'', i)
    print '================================================='

我是 regex 的新手,也是 python 的新手。那么你能推荐一些更好的方法来处理它吗?

【问题讨论】:

标签: python regex


【解决方案1】:

您可以使用BeautifulSoup 来解析html。以csv格式写入表格内容:

#!/usr/bin/env python
import csv
import sys
import urllib2
from bs4 import BeautifulSoup # $ pip install beautifulsoup4

soup = BeautifulSoup(urllib2.urlopen('http://poj.org/status'))

writer = csv.writer(sys.stdout)
for tr in soup.find('table', 'a')('tr'):
    writer.writerow([td.get_text() for td in tr('td')])

输出

Run ID,User,Problem,Result,Memory,Time,Language,Code Length,Submit Time
10876151,yangfanhit,3155,Accepted,344K,219MS,C++,3940B,2012-10-02 16:42:45
10876150,BandBandRock,2503,Accepted,16348K,2750MS,G++,840B,2012-10-02 16:42:25

【讨论】:

    【解决方案2】:

    还可以查看PyQuery。如果你熟悉 jQuery,很容易上手。这是一个将表头和数据作为字典列表返回的示例。

    import itertools
    from pyquery import PyQuery as pq
    
    # parse html
    html = pq(url="http://poj.org/status")
    
    # extract header values from table
    header = [header.text for header in html(".a").find(".in").find("td")]
    
    # extract data values from table rows in nested list
    detail = [[td.text for td in tr] for tr in html(".a").children().not_(".in")]
    
    # merge header and detail to create list of dictionaries
    result = [dict(itertools.izip(header, values)) for values in detail]
    

    【讨论】:

      【解决方案3】:

      你真的不需要直接使用正则表达式来解析 html,see answer here

      或参阅Dive into Python Chapter 8 了解 HTML 处理。

      【讨论】:

        【解决方案4】:

        为什么你已经有了 HTML/XML 解析器,而这些解析器可以轻松为你完成这项工作

        使用BeautifulSoup。考虑到上面问题中提到的你想要什么,它可以在 2-3 行代码中完成。

        例子:

        >>> from bs4 import BeautifulSoup as bs
        >>> html = """
        <tr align=center><td>10876151</td><td><a href=userstatus?user_id=yangfanhit>yangfanhit</a></td><td><a href=problem?id=3155>3155</a></td><td><font color=blue>Accepted</font></td><td>344K</td><td>219MS</td><td>C++</td><td>3940B</td><td>2012-10-02 16:42:45</td></tr>
        <tr align=center><td>10876150</td><td><a href=userstatus?user_id=BandBandRock>BandBandRock</a></td><td><a href=problem?id=2503>2503</a></td><td><font color=blue>Accepted</font></td><td>16348K</td><td>2750MS</td><td>G++</td><td>840B</td><td>2012-10-02 16:42:25</td></tr>
        """
        
        >>>soup = bs(html)
        >>>soup.td
        >>><td>10876151</td>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-18
          • 2017-07-31
          • 2014-08-10
          相关资源
          最近更新 更多