我有一个奇怪的问题。我正在使用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
我不知道该怎么做。我已经尝试过正则表达式,但这似乎也不起作用。有人有这方面的经验吗?
答案 0 :(得分:2)
意外顺序是由'\r'
字符或回车引起的。将其替换为''
或' '
,然后处理您的字符串。
str(attr_dict['title']).replace('\r', '')
考虑字符串:
st = "This is SO\rThat"
现在,如果你打印字符串,
print st
That is SO
这是因为遇到\r
或carriage 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
,您将更好地了解正在发生的事情。我怀疑你在这个过程中会在代码中发现其他一些错误,但至少你能够在那时正确地看到输出。