Python使用正则表达式解析HTML

时间:2014-05-08 17:21:20

标签: python html regex python-2.7 html-parsing

我正在尝试浏览网站的HTML并解析它以查找课程的最大注册量。我尝试在HTML文件的每一行中检查子字符串,但这会尝试解析错误的行。所以我现在正在使用正则表达式。我现在有\t\t\t\t\t\t\t<td class="odd">([0-9])|([0-9][0-9])|([0-9][0-9][0-9])<\/td>\r\n作为我的正则表达式,但这个正则表达式与最大注册次数和部分编号相匹配。还有另一种方法可以解决我想从网页中提取的内容吗? HTML代码段如下:

<tr>
    <td class="tableHeader">Section</td>
    <td class="odd">001</td>
</tr>

<tr>
    <td class="tableHeader">Credits</td>
    <td class="even" align="left">  4.00</td>
</tr>

<tr>
<td class="tableHeader">Title</td>
<td class="odd">Linear Algebra</td>
</tr>

<tr>
    <td class="tableHeader">Campus</td>
    <td class="even" align="left">University City</td>
</tr>

<tr>
    <td class="tableHeader">Instructor(s)</td>
    <td class="odd">Guang  Yang</td>
</tr>
<tr>
    <td class="tableHeader">Instruction Type</td>
    <td class="even">Lecture</td>
</tr>

<tr>
    <td class="tableHeader">Max Enroll</td>
    <td class="odd">30</td>
</tr>

3 个答案:

答案 0 :(得分:5)

DO NOT PARSE HTML USING REGEXP.

使用正确的工具来完成正确的工作。

让我们做一个类比来解释为什么它是错的:就像尝试5 year old理解Hamlet,而他没有vocabulary and grammar来理解Shakespeare's,当他能够process more abstract concepts时,他会得到。

使用lxmlBeautifulSoup来执行此操作。

作为一个例子:获得所有平均值和所有赔率的列表:

>>> from lxml import etree
>>> tree = etree.HTML(your_html_text)
>>> odds = tree.xpath('//td[@class="odd"]/text()')
>>> evens = tree.xpath('//td[@class="even"]/text()')
>>> odds
['001', 'Linear Algebra', 'Guang  Yang', '30']
>>> evens
['  4.00', 'University City', 'Lecture']

编辑:

  

我只是想以这样一种方式提取内容,我没有得到章节编号和最大注册号码。我只需要获得Max Enroll号码的帮助。

好的,现在我得到了你想要的东西,所以这里是使用lxml的解决方案:

>>> for elt in tree.xpath('//tr'):
...     if elt.xpath('td[@class="tableHeader"]')[0].text == "Max Enroll":
...         elt.xpath('td[@class="odd"]|td[@class="even"]')[0].text
... 
'30'

您只有 最大注册号码。

使用BeautifulSoup更容易:

>>> bs = BeautifulSoup(your_html_text)
>>> for t in bs.findAll('td', attrs={'class': 'tableHeader'}):
...   if t.text == "Max Enroll":
...     print t.findNext('td').text
'30'

答案 1 :(得分:3)

使用专门解析html的工具,例如BeautifulSoup

  

Beautiful Soup是一个用于从HTML和HTML中提取数据的Python库   XML文件。它适用于您最喜欢的解析器,以提供惯用语   导航,搜索和修改解析树的方法。它   通常可以节省程序员数小时或数天的工作量。

例如,以下是您可以获得所需内容的方法:

from bs4 import BeautifulSoup

data = """your html here"""

soup = BeautifulSoup(data)
print soup.find('td', text="Max Enroll").find_next_sibling('td').text

打印:

30

答案 2 :(得分:1)

zmo's answer的替代方案,使用BeautifulSoup

from bs4 import BeautifulSoup

data = """
<snipped html>
"""

soup = BeautifulSoup(data)

for tableHeaders in soup.find_all('td', class_="tableHeader"):
    if tableHeaders.get_text() == "Max Enroll":
        print tableHeaders.find_next_siblings('td', class_="odd")[0].get_text()

输出:

30