使用Beautiful Soup获取特定的tr元数据

时间:2014-11-28 00:14:05

标签: python html regex beautifulsoup metadata

我有一个奇怪的问题。我正在使用python用美丽的汤刮一页。我需要的一个值是tr元数据,我可以使用以下命令打印到我的屏幕:

meta = tr.findNext('td', {'class':'field1'})
attr_dict = meta.a.attrs 
print(attr_dict)

这会产生:

{'href': '/client/displayEmail.asp?rid=1318441&cid=12339', 
 'rel': ['gb_page_center[940,', '600]'], 
 'title': 'ID: manualavenue100daily120141127073104:EG_CO_NEWS_1/08-14-14_yahoo\rLooking for schools? Get free information today.\rFrom: degree@newsconsul.com\rDate: 11/27/2014 7:33:34 AM'}

我想提取以下信息:EG_CO_NEWS_1 / 08-14-14_yahoo但似乎无法获得它。

目前我正在这样做:

campaign_raw = str(attr_dict['title'][:80])

产生:

'Lookianualavenue100daily120141127073104:EG_CO_NEWS_1/08-14-14_yahoo' 

主题和模板名称在意外顺序中的奇怪串联。

我试图将字符串拆分为':'并取最后一段,这会产生: Looki_NEWS_1 / 08-14-14_yahoo

我不知道该怎么做。我已经尝试过正则表达式,但这似乎也不起作用。有人有这方面的经验吗?

2 个答案:

答案 0 :(得分:2)

意外顺序是由'\r'字符或回车引起的。将其替换为''' ',然后处理您的字符串。

str(attr_dict['title']).replace('\r', '')

考虑字符串:

st = "This is SO\rThat"

现在,如果你打印字符串,

print st
That is SO

这是因为遇到\rcarriage return时,设备的位置会重置为一行文本的开头。

答案 1 :(得分:0)

\r属性中的title个字符是造成这种情况的原因。 \r是CARRIAGE RETURN字符,U + 0013。通常用于一行文本末尾的字符是LINEFEED字符,U + 0010,在Python(以及大多数其他编程语言)中为\n

打印\n字符时会发生什么,光标会转到新行的开头。但是当你打印\r字符时会发生什么,光标会移到当前行的开头;这是为了让那些希望让用户了解他们进度的程序(“0%完成...... 10%完成...... 20%完成......”)而不会进入复杂的过程来移动光标:只需打印一个\r字符,重新打印N%已完成的消息,然后继续。

这里发生的事情是你正在获取title属性的前80个字符,并将它们放在campaign_raw中,最终(我假设)获取打印。恰好这样,修剪80个字符包括第一个\ r \ n和“寻找学校?”这几个字符。因此,当您打印该字符串时,它会打印整个ID,然后\r使其返回到行的开头并打印其余部分(“寻找学校?”中的几个字符。)

\r替换为\n,您将更好地了解正在发生的事情。我怀疑你在这个过程中会在代码中发现其他一些错误,但至少你能够在那时正确地看到输出。