拆分文本以获取特定部分?

时间:2013-11-24 11:48:56

标签: python beautifulsoup

我正在使用Python推出有人拥有的居住国。国家所在的行(地址伪造):

<HR NOSHADE SIZE="1" COLOR="#000000"><B>Buyer Information</B><HR NOSHADE SIZE="1" COLOR="#000000">
<TABLE WIDTH="100%" BORDER="0" CELLPADDING="1" CELLSPACING="0" CLASS="ta"><TR BGCOLOR="#EEEEEE">
<TD WIDTH="25%">&nbsp;Username:</TD>
<TD WIDTH="75%"><B>joedane</B>&nbsp;<A HREF="http://www.bricklink.com/feedback.asp?u=joedane">(6)</A><IMG BORDER=0 ALT="" SRC="/images/dot.gif" ALIGN="ABSMIDDLE" WIDTH="4" HEIGHT="16"></TD></TR><TR BGCOLOR="#EEEEEE">
<TD>&nbsp;E-Mail:</TD><TD><A HREF="mailto:lala@lala.la">lala@lala.la</A></TD></TR><TR BGCOLOR="#EEEEEE">
<TD WIDTH="25%" VALIGN="TOP">&nbsp;Name & Address:</TD>
<TD WIDTH="75%">Joe Dane
<BR>XXXX 24
<BR>12345 QWERTY
<BR>Germany</TD>
</TR></TABLE>
<HR NOSHADE SIZE="1" COLOR="#000000"><B>Seller Information</B><HR NOSHADE SIZE="1" COLOR="#000000">

我需要在倒数第三排得到'德国'。但是,国家和地址每次都会有所不同,所以我需要一种方法来拉出这个国家,但不要取决于之前的地址。

我试过了:

#get Shipping Destination
shippingDest = order.split('</TD></TR></TABLE><HR NOSHADE SIZE="1" COLOR="#000000"><B>Seller Information</B>')[0].split('<BR>')[1]

但它并没有停留在线前找到的第一个BR上。希望我的分裂概念是错误的。这应该是一个容易的问题。有帮助吗?


编辑:

实际代码仍在继续,在卖家信息之后,与德国的买家信息中的代码类似,但与我自己的国家/地区相似。该剧本产生了西班牙,我自己的国家。我可以以某种方式让它跳过我的国家去第二个吗?如果您要倒退,那将是卖家信息之后的那个。

这是直到html结尾的实际代码。在德国之后,它总是一样的。

<HR NOSHADE SIZE="1" COLOR="#000000"><B>Buyer Information</B><HR NOSHADE SIZE="1" COLOR="#000000">
<TABLE WIDTH="100%" BORDER="0" CELLPADDING="1" CELLSPACING="0" CLASS="ta"><TR BGCOLOR="#EEEEEE">
<TD WIDTH="25%">&nbsp;Username:</TD>
<TD WIDTH="75%"><B>joedane</B>&nbsp;<A HREF="http://www.bricklink.com/feedback.asp?u=joedane">(6)</A><IMG BORDER=0 ALT="" SRC="/images/dot.gif" ALIGN="ABSMIDDLE" WIDTH="4" HEIGHT="16"></TD></TR><TR BGCOLOR="#EEEEEE">
<TD>&nbsp;E-Mail:</TD><TD><A HREF="mailto:lala@lala.la">lala@lala.la</A></TD></TR><TR BGCOLOR="#EEEEEE">
<TD WIDTH="25%" VALIGN="TOP">&nbsp;Name & Address:</TD>
<TD WIDTH="75%">Joe Dane
<BR>XXXX 24
<BR>12345 QWERTY
<BR>Germany</TD>
</TR></TABLE>
<HR NOSHADE SIZE="1" COLOR="#000000"><B>Seller Information</B><HR NOSHADE SIZE="1" COLOR="#000000">
<TABLE WIDTH="100%" BORDER="0" CELLPADDING="1" CELLSPACING="0" CLASS="ta">
<TR BGCOLOR="#EEEEEE">
<TD WIDTH="25%">&nbsp;Username:</TD><TD WIDTH="75%"><B>Brick_Top</B>&nbsp;<A HREF="http://www.bricklink.com/feedback.asp?u=Brick_Top">(466)</A>
<A HREF="http://www.bricklink.com/help.asp?helpID=54">
<IMG ALT="" WIDTH="16" HSPACE="3" ALIGN="ABSMIDDLE" HEIGHT="16" BORDER="0" SRC="/images/bricks/star2.png"></A>
<A HREF="http://www.bricklink.com/aboutMe.asp?u=Brick_Top">
<IMG ALT="" WIDTH="18" ALIGN="ABSMIDDLE" HEIGHT="16" BORDER="0" SRC="/images/bricks/me.png"></A></TD></TR><TR BGCOLOR="#EEEEEE">
<TD>&nbsp;Store Name:</TD><TD><B>Top Bricks from Brick Top</B></TD></TR><TR BGCOLOR="#EEEEEE">
<TD>&nbsp;Store Link:</TD><TD><A HREF="/store.asp?p=Brick_Top">http://www.bricklink.com/store.asp?p=Brick_Top</A></TD></TR><TR BGCOLOR="#EEEEEE">
<TD>&nbsp;E-Mail:</TD><TD><A HREF="mailto:myemail@gmail.com">myemail@gmail.com</A></TD></TR><TR BGCOLOR="#EEEEEE">
<TD WIDTH="25%" VALIGN="TOP">&nbsp;Name & Address:</TD>
<TD WIDTH="75%">Gerald Me
<BR>qwerty 234
<BR>Sevilla 41500
<BR>Spain</TD></TR></TABLE>

我想要的只是那个德国(这两个国家中的第一个国家)。很多,非常感谢。


编辑2.0:

有趣的是,我能够只添加[-5]。我不太了解,但我的猜测是它找到了第一张桌子的第五个BR。

from bs4 import BeautifulSoup
import sys

soup = BeautifulSoup(open(sys.argv[1], 'r'), 'html')

country = soup.find('table').find_all('br')[-5]
print(country.find_next(text=True).string)

2 个答案:

答案 0 :(得分:4)

我建议你使用像这样的html解析器。它找到表的最后<br>并从那里搜索下一个兄弟,包括返回国家的文本节点:

from bs4 import BeautifulSoup
import sys 

soup = BeautifulSoup(open(sys.argv[1], 'r'), 'html')

country = soup.find('table').find_all('br')[-1]
print(country.find_next(text=True).string)

像以下一样运行:

python3 script.py htmlfile 

产量:

Germany

答案 1 :(得分:1)

您可以使用regular expression

target_str="<HR NOSHADE SI..."

results=re.findall(r"<BR>\w*{20}</TD>", target_str)

for country in results:
   print country   //the out put will be  <BR>Germany</TD>

                   //you can do some other things 
                   //to pull Germany out of  <BR>Germany</TD>