我正在尝试浏览网站的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>
答案 0 :(得分:5)
DO NOT PARSE HTML USING REGEXP.
使用正确的工具来完成正确的工作。
让我们做一个类比来解释为什么它是错的:就像尝试5 year old理解Hamlet,而他没有vocabulary and grammar来理解Shakespeare's,当他能够process more abstract concepts时,他会得到。
使用lxml
或BeautifulSoup
来执行此操作。
作为一个例子:获得所有平均值和所有赔率的列表:
>>> 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']
编辑:
好的,现在我得到了你想要的东西,所以这里是使用lxml的解决方案:我只是想以这样一种方式提取内容,我没有得到章节编号和最大注册号码。我只需要获得Max Enroll号码的帮助。
>>> 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