2010-03-06 87 views
3

同时使用beautifulsoup解析HTML中的表每隔一行开始与我如何停止美丽的汤从解析时跳过行?

<tr class="row_k"> 

而不是tr标签无类

样本HTML

<tr class="row_k"> 
<td><img src="some picture url" alt="Item A"></td> 
<td><a href="some url"> Item A</a></td> 
<td>14.8k</td> 
<td><span class="drop">-555</span></td> 
<td> 
<img src="some picture url" alt="stuff" title="stuff"> 
</td> 
<td> 
<img src="some picture url" alt="Max llll"> 
</td> 
</tr> 
<tr> 
<td><img src="some picture url" alt="Item B"></td> 
<td><a href="some url"> Item B</a></td> 
<td>64.9k</td> 
<td><span class="rise">+165</span></td> 
<td> 
<img src="some picture url" alt="stuff" title="stuff"> 
</td> 
<td> 
<img src="some picture url" alt="max llll"> 
</td> 
</tr> 
<tr class="row_k"> 
<td><img src="some picture url" alt="Item C"></td> 
<td><a href="some url"> Item C</a></td> 
<td>4,000</td> 
<td><span class="rise">+666</span></td> 
<td> 
<img src="some picture url" title="stuff"> 
</td> 
<td> 
<img src="some picture url" alt="Maximum lllle"> 

我想提取的文本是14.8k,64.9k和4,000

this1 = urllib2.urlopen('my url').read() 
this_1 = BeautifulSoup(this1) 
this_1a = StringIO.StringIO() 
for row in this_1.findAll("tr", { "class" : "row_k" }): 
    for col in row.findAll(re.compile('td')): 
    this_1a.write(col.string if col.string else '') 
Item_this1 = this_1a.getvalue() 

我觉得这段代码写得不好,是否有更灵活的工具可以使用,比如XML解析器?有人可以建议。

仍然开放给任何仍然使用美丽的答案。

+0

如果您包含更多的html,会更容易。我想你是说在表格的正文中有一个锚标记,并且表格中的下一列通过锚点选项卡具有所需的数据。 – PyNEwbie

+0

我做了一个示例。我使用beautifulsoup来做到这一点,但问题是表中的所有其他列都有tr class =“row_k”,所以它忽略它,不会给我tr标签中的信息。我会更新我的问题。 – Pevo

回答

2

我还在学习很多,但我会建议你尝试lxml。我会刺穿这个,我认为它会让你在那里,但可能有一些我不确定的细节。

假设this1是一个字符串

from lxml.html import fromstring 
this1_tree=fromstring(this1) 
all_cells=[(item[0], item[1]) for item in enumerate(this1_tree.cssselect('td'))] # I am hoping this gives you the cells with their relative position in the document) 

我不能完全确定有关的是你是否测试每个单元的键或值或TEXT_CONTENT以找出是否有您正在寻找的字符串的唯一的事在锚点引用或文本中。这就是为什么我想要一个你的html样本。但是,其中的一个应该工作

the_cell_before_numbers=[] 
for cell in all_cells: 
    if 'Item' in cell[1].text_content(): 
     the_cell_before_numbers.append(cell[0]) 

现在,你有你可以前的细胞则通过获得下一个单元

todays_price=all_cells[the_cell_before_number+1][1].text_content() 

的文本内容得到你所需要的价值,我相信是有更漂亮的方式,但我认为这会让你在那里。

我使用你的html进行了测试,我找到了你要找的东西。

+0

我更新了html – Pevo

+0

的样本抱歉,我是这个品牌的新成员。我不知道如何实现这一点? = /我在哪里把所有这一切? – Pevo

+0

那么我使用的是lxml而不是BeautifulSoup。所以你需要安装lxml。您需要回到此问题的早期版本,因为我的答案是使用该描述构建的。但是这个代码应该会让你在那里。它假定this1是使用urllib拉入的htm页面,它是一个字符串对象。 – PyNEwbie