当前位置: 首页 > 知识库问答 >
问题:

从HTMLTD中检索多个字符串,对字符串进行分隔并使用TD元素的循环连接它们?

鲜于承基
2023-03-14

因此,我试图学习如何使用BeautifulSoup从一个将关键字符串连接到一个块中的网站获取数据。我有一些成功,我可以胜任谷歌在网上。我被困在这一点上,似乎我错过了一些基本的东西,但我不得不寻求帮助,一圈又一圈。我希望有人能给我指出正确的方向,或者给我一些反馈,告诉我哪里出了错:

首先:我给出了这个问题的一个简单版本,因为我不想发布一本完整的书。如果有人想深入了解我所犯的问题和实际错误,我会将我编写的脚本和实际代码附加在单独的文件中。我相信这是我在字符串和列表中犯的一个小概念错误,没有进一步的延迟

在此处输入代码

<html>
    <head>


        <center>
        <font face="arial" size="5">
        <table border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#000066">

        <tr>
            <td align="left" valign="top" bgcolor="#000066">

          <a href="/"><img height="50" width="540" src="/leftbar-quote.gif" border="0" usemap="#leftbar10b39c7"></a>
              <map name="leftbar10b39c7"><area href="/outside/multi.htm" coords="328,5,390,36" shape="rect">
              <area href="/index.htm" coords="254,5,322,37" shape="rect">
              <area href="#" coords="185,5,251,35" shape="rect" onclick="history.back(); return false;">
              <area href="/cgi-bin/quoteForm.cgi?type=q&sEmail=&part=Engine&dbPart=300.1&dbSubPart=&model=Ford%20Focus&dbModel=27.20&year=2005&name=AutoPartex.net&int=-1&uIMS=&userSearch=exact&seqNum=600000000000000000456918622&ref=&userid=1000&email=&userClaim=&userLang=&userZip=&selleruserid=1000" coords="400,5,460,36" shape="rect">
              <area href="/buyerfaq.htm" coords="470,5,530,36" shape="rect">
              </map>


            </td>
            <td valign=top><div align="right"><img height="50" width="36" src="/result-rs.gif"></div></td>
        </tr>
<tr>
<td COLSPAN=2><table WIDTH="100%"><tr>
            <td width="10" valign="top"><img height="30" width="10" src="/trans4.gif"></td>
            <td width="90%">
            <b>
<div style='font-size:18pt; font-style: italic; color: white;'><b>Results sorted by <u>PRICE</u></b> <span class="small"><b>(Click on heading to re-sort)</b></span><br /></div><font color='#FFFFFF' face='Arial,Helvetica,Geneva,Swiss,SunSans-Regular' size='2'>Click back to modify your previous choice.<br>Most prices do not include extended warranties or shipping.<br>Not all displayed parts are interchangeable.  Please verify with the recycler that the part fits your auto.<br /></font></b></td><td valign=bottom align=center><table bgcolor="#e4e4e4"width=350 cellpadding=3 border=1 cellspacing=0><tr><td align=center><form method="post" action="/cgi-bin/search.cgi" style="display: inline"><input type= hidden name=userDate value="2005"><input type= hidden name=userModel value="Ford Focus"><input type= hidden name=userLocation value="USA"><input type= hidden name=userPreference value="price"><input type= hidden name=userZip value=""><input type="hidden" name="userPage" value="1"><input type="hidden" name="userInterchange" value="None"><input type="hidden" name="userDate2" value="Ending Year"><input type="hidden" name="userSearch" value="int"><input type="hidden" NAME="userClaim" VALUE="">
<input type="hidden" NAME="userClaimer" VALUE="">
<input type="hidden" NAME="userLang" VALUE="">
<input type="hidden" NAME="userLat" VALUE="">
<input type="hidden" NAME="userLong" VALUE="">
<input type="hidden" NAME="userCSA" VALUE="">
<input type="hidden" NAME="userMCO" VALUE="">
<input type="hidden" NAME="userAdjuster" VALUE="">
<input type="hidden" NAME="userItem" VALUE="">
<input type="hidden" NAME="hpsDate" VALUE="">
<input type="hidden" NAME="hpsGroup" VALUE="">
<input type="hidden" NAME="reqId" VALUE="">
<input type="hidden" NAME="thirdMapType" VALUE="">
<input type="hidden" NAME="vendUrl" VALUE="">
<input type="hidden" NAME="iCN" VALUE="">
<input type='hidden' name='limitYears' value=''>
<input type='hidden' name='userIntSelect' value='711575'>
<input type='hidden' name='userVIN' value=''>
<input type='hidden' name='vinSearch' value='0'>
<input type='hidden' name='userVINModelID' value=''>
<input type="hidden" name="uID" value=""><input type="hidden" name="uPass" value=""><table bgcolor="#e4e4e4" width=350 cellpadding=3 border=1 cellspacing=0><tr><td colspan=2 align=center>2005&nbsp;Ford Focus<br>Engine<br></td></tr><tr>
<td align=center>

    <font style="font-size: 10pt">Non-Interchange search for year:<br></font>
    <font style="font-size: 10pt"><b>2005</b><br><br></font>
<br>
<br><font style="font-size: 8pt"><a style="color:blue" href="/cgi-bin/search.cgi?userDate=2005&userModel=Ford%20Focus&userPart=Engine&origPart=&userPreference=price&userZip=&userLat=&userLong=&userVIN=&dbPart=300.1&userIntSelect=711575&userClaimer=&userClaim=&uID=&uPass=&userLocation=USA&userSearch=int">Click Here</a> to see All Interchange Choices </font>
</td>
</table></table></form>
</td></tr></table></td></tr></table><table width="100%" border="1" cellspacing="0" cellpadding="4">
<tr align=center>
    <td><a href='/cgi-bin/search.cgi?userSearch=exact&userPID=1000&userLocation=USA&userIMS=&userInterchange=%5B%7C%7Br&userSide=&userDate=2005&userDate2=2005&dbModel=27.20&userModel=Ford%20Focus&dbPart=300.1&userPart=Engine&sessionID=600000000000000000456918622&userPreference=year&userIntSelect=711575&userUID=0&userBroker=&userPage=1&iKey='>Year</a><br>Part<br>Model</td>
    <td>Description</td>
    <td><a href='/cgi-bin/search.cgi?userSearch=exact&userPID=1000&userLocation=USA&userIMS=&userInterchange=%5B%7C%7Br&userSide=&userDate=2005&userDate2=2005&dbModel=27.20&userModel=Ford%20Focus&dbPart=300.1&userPart=Engine&sessionID=600000000000000000456918622&userPreference=miles&userIntSelect=711575&userUID=0&userBroker=&userPage=1&iKey='>Miles</a></td>
<td><a href='/cgi-bin/search.cgi?userSearch=exact&userPID=1000&userLocation=USA&userIMS=&userInterchange=%5B%7C%7Br&userSide=&userDate=2005&userDate2=2005&dbModel=27.20&userModel=Ford%20Focus&dbPart=300.1&userPart=Engine&sessionID=600000000000000000456918622&userPreference=grade&userIntSelect=711575&userUID=0&userBroker=&userPage=1&iKey='>Part <br> Grade</a></td>   <td>Stock#</td>
    <td>US<br>Price</td>
    <td>Dealer Info</td></tr><tr><td>2005<br>Engine Assembly<br>Ford Focus</td><td><a href=""><img width="100" hspace="3" align="middle" onclick="return popupImg('seller=2013&partGUID=2013-1-282435&vehicleGUID=2013-1-V18432&display=2005%20Ford%20Focus%20Engine%20Assembly-Stock%23%2010286')" src="http://wsimgoh.autopartex.net/2013/2015/10286/2013_18432_05_thumb.jpg"></img></a>ZX4,2.0,EFI,FATO,FWDRUNSGREAT</td><td align=right>&nbsp;</td><td align=center>&nbsp;</td><td>10286</td><td align=center>$350550</td><td><A HREF="http://www.LaPointAuto.com" target="_top">LaPoint Discount MIDW</A> USA-OH(Holland)  <A HREF="/cgi-bin/quoteForm.cgi?type=g&sEmail=shawn@LaPointAuto.com&email=&part=Engine%20Assembly&dbPart=300.1&dbSubPart=&model=Ford%20Focus&dbModel=27.20&year=2005&stockNum=10286&price=350550&desc=ZX4%2C2.0%2CEFI%2CFATO%2CFWDRUNSGREAT&name=LaPoint%20Discount%20MIDW&url=http://www.LaPointAuto.com&int=-1&broker=0&recycler=0&selleruserid=2013&miles=-1&condition=-1&userid=1000&uIMS=&seqNum=600000000000000000456918622&userClaim=&userLang=">Request_Quote</A> 419-865-2329 / 800-845-0270 <A HREF="/cgi-bin/quoteForm.cgi?type=i&sEmail=shawn@LaPointAuto.com&email=&part=Engine%20Assembly&dbPart=300.1&dbSubPart=&model=Ford%20Focus&dbModel=27.20&year=2005&stockNum=10286&price=350550&desc=ZX4%2C2.0%2CEFI%2CFATO%2CFWDRUNSGREAT&name=LaPoint%20Discount%20MIDW&url=http://www.LaPointAuto.com&int=-1&broker=0&recycler=0&selleruserid=2013&miles=-1&condition=-1&userid=1000&uIMS=&seqNum=600000000000000000456918622&userClaim=&userLang=">Request_Insurance_Quote</A><br><a target=_blank href="http://appcgi.autopartex.net/cgi-bin/applet.cgi?sid=2013&brf=&bds=&bsr=price&pin=&pyr=2005&pmd=Ford%20Focus&ppt=Engine%20Assembly&ppr=350550&pst=10286&pgr=&bty=WEB&bem=&bzp=&ses=600000000000000000456918622" onclick='window.open(this.href,this.target,getPrm()); return false'><img src='/images/LiveChat_space.gif' border=0></a></b></td></tr><tr><td>2005<br>Engine Assembly<br>Ford Focus</td><td>TESTED,2.3L,5MT,08/04,FWD,+CORE</td><td align=right>&nbsp;</td><td align=center>&nbsp;</td><td>E94764</td><td align=center>$1500</td><td><A HREF="http://www.ParadiseAutoParts.com" target="_top">Paradise Auto Parts-ELITE</A> USA-MD(Elkton)  <A HREF="/cgi-bin/quoteForm.cgi?type=g&sEmail=mdriver@complete-recycle.com&email=&part=Engine%20Assembly&dbPart=300.1&dbSubPart=&model=Ford%20Focus&dbModel=27.20&year=2005&stockNum=E94764&price=1500&desc=TESTED%2C2.3L%2C5MT%2C08%2F04%2CFWD%2C%2BCORE&name=Paradise%20Auto%20Parts-ELITE&url=http://www.ParadiseAutoParts.com&int=-1&broker=0&recycler=0&selleruserid=2843&miles=-1&condition=-1&userid=1000&uIMS=&seqNum=600000000000000000456918622&userClaim=&userLang=">Request_Quote</A> 888-811-5051/410-620-5051 <A HREF="/cgi-bin/quoteForm.cgi?type=i&sEmail=mdriver@complete-recycle.com&email=&part=Engine%20Assembly&dbPart=300.1&dbSubPart=&model=Ford%20Focus&dbModel=27.20&year=2005&stockNum=E94764&price=1500&desc=TESTED%2C2.3L%2C5MT%2C08%2F04%2CFWD%2C%2BCORE&name=Paradise%20Auto%20Parts-ELITE&url=http://www.ParadiseAutoParts.com&int=-1&broker=0&recycler=0&selleruserid=2843&miles=-1&condition=-1&userid=1000&uIMS=&seqNum=600000000000000000456918622&userClaim=&userLang=">Request_Insurance_Quote</A><br><a target=_blank href="http://appcgi.autopartex.net/cgi-bin/applet.cgi?sid=2843&brf=&bds=&bsr=price&pin=&pyr=2005&pmd=Ford%20Focus&ppt=Engine%20Assembly&ppr=1500&pst=E94764&pgr=&bty=WEB&bem=&bzp=&ses=600000000000000000456918622" onclick='window.open(this.href,this.target,getPrm()); return false'><img src='/images/LiveChat_space.gif' border=0></a></b></td></tr><tr><td>2005<br>Engine Assembly<br>Ford Focus</td><td>175-175</td><td align=right>38,916</td><td align=center>A</td><td>FC6555</td><td align=center>$1250</td><td><A HREF="http://www.DonsSportcar.com" target="_top">Don's Sportcar</A> USA-CO(Pueblo)  <A HREF="/cgi-bin/quoteForm.cgi?type=g&sEmail=parts@DonsSportcar.com&email=&part=Engine%20Assembly&dbPart=300.1&dbSubPart=&model=Ford%20Focus&dbModel=27.20&year=2005&stockNum=FC6555&price=1250&desc=175-175&name=Don's%20Sportcar&url=http://www.DonsSportcar.com&int=-1&broker=0&recycler=0&selleruserid=3776&miles=38.916&condition=-1&userid=1000&uIMS=&seqNum=600000000000000000456918622&userClaim=&userLang=">Request_Quote</A> 800-332-3649 <A HREF="/cgi-bin/quoteForm.cgi?type=i&sEmail=parts@DonsSportcar.com&email=&part=Engine%20Assembly&dbPart=300.1&dbSubPart=&model=Ford%20Focus&dbModel=27.20&year=2005&stockNum=FC6555&price=1250&desc=175-175&name=Don's%20Sportcar&url=http://www.DonsSportcar.com&int=-1&broker=0&recycler=0&selleruserid=3776&miles=38.916&condition=-1&userid=1000&uIMS=&seqNum=600000000000000000456918622&userClaim=&userLang=">Request_Insurance_Quote</A><br><a target=_blank href="http://appcgi.autopartex.net/cgi-bin/applet.cgi?sid=3776&brf=&bds=&bsr=price&pin=&pyr=2005&pmd=Ford%20Focus&ppt=Engine%20Assembly&ppr=1250&pst=FC6555&pgr=A&bty=WEB&bem=&bzp=&ses=600000000000000000456918622" onclick='window.open(this.href,this.target,getPrm()); return false'><img src='/images/LiveChat_space.gif' border=0></a></b></td></tr>
</table>
</div>
</body> </html>

这是html文本和结构。以下是我在方法方面真正需要帮助的:

>

  • 没有css装饰器,我无法找到使用xpath或类似selenium的传统示例。我可能是错的新手

    我需要将单元格中的文本分割成单独的字符串。

    我尝试使用一些方法来获取文本

    在尝试类似的操作后,我发现以下错误:

    在此处输入bs4 import BeautifulSoup中的代码

    soup=BeautifulSoup(打开(“./test.html”),“lxml”)

    trs=汤。查找所有('tr')

    对于trs中的tr:

        tds = tr.find_all("td")
    
        try:
            result = str(tds[0].get_text())
    
        except:
              adjust =  ' '
              continue
    
        result = result.split(" ")
    
        result = str.replace('2005Engine', "2005Engine", "2005 ")  + str.replace('AssemblyFord', "AssemblyFord", "Engine Assembly ") + str.repl$
    
        strresult = ''.join(result)
    
    
        trs = soup.find_all('tr')
    
        for tr in trs:
    
               tds = tr.find_all("td")
    
               tds[0] = strresult
    
               tds.get_text()
    
               print(tds)
    

    错误信息:

    Traceback(最近一次调用最后一次):文件carpartbs5.find.td.py,第33行,tds.get_text()

    文件“/usr/local/lib/python2.7/dist packages/bs4/element.py”,第1807行,在getattr中

    "ResultSet object has no attribute '%s'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?" % key
    

    AttributeError:ResultSet对象没有属性“get_text”。您可能将项目列表视为单个项目。当您打算调用find()时,是否调用了find_all()?

    这是翻页搜索:

    当我刚刚打印tds时,它使用任何数组替换第一个td,但是,每当我尝试使用get_text()方法返回文本时,它会抛出该错误。该错误似乎表明我在调用不可能的方法时遇到了问题。

    所以我不太清楚列表和字符串。我试图将我的列表转换为一个实际的字符串,但它不起作用。我想,因为我使用的是一个列表,这就是它无法获取文本的原因。如果是,是否有更好的方法使用BeautifulSoup来实现以下目标:

    1. 从每个元素中的这些位置获取单独的文本
    2. 在一个逗号分隔的字符串结果中加入它们?

    希望这能有所帮助,我没有足够的点数来发布图片或上传文件。最后一段文字是我的程序吐出的,如果我不尝试并在tds变量上调用BEAUTIFULSOUP方法。感谢先进!

    我的代码

    从bs4导入美丽汤

    soup=BeautifulSoup(打开(“./test.html”),“lxml”)

    trs=汤。查找所有('tr')

    对于trs中的tr:

        tds = tr.find_all("td")
    
        try:
            result = str(tds[0].get_text())
    
        except:
              adjust =  ' '
              continue
    
        result = result.split(" ")
    
        result = str.replace('2005Engine', "2005Engine", "2005 ")  + str.replace('AssemblyFord', "AssemblyFord", "Engine Assembly ") + str.repl$
    
        strresult = ''.join(result)
    
    
        trs = soup.find_all('tr')
    
        for tr in trs:
    
               tds = tr.find_all("td")
    
               tds[0] = strresult
    
               print(tds)'
    

    返回的是什么-样本

    ['2005 Engine Assembly Ford Focus ', <td>139K</td>, <td align="right">\xa0</td>, <td align="center">\xa0</td>, <td>0232</td>, <td align="center">$800</td>, <td><a href="http://someurl.com" target="_top">Chads Part </a> USA-FL(Jacksonville)  <a href="/cgi-bin/quoteForm.cgi?type=g&amp;sEmail=chadsparts@someplace.com&amp;email=&amp;part=Engine%20Assembly&amp;dbPart=300.1&amp;dbSubPart=&amp;model=Ford%20Focus&amp;dbModel=27.20&amp;year=2005&amp;stockNum=0232&amp;price=800&amp;desc=139K&amp;name=Chads%20Parts&amp;url=http://someurl.com&amp;int=-1&amp;broker=0&amp;recycler=0&amp;selleruserid=3566&amp;miles=-1&amp;condition=-1&amp;userid=1000&amp;uIMS=&amp;seqNum=600000000000000000456918622&amp;userClaim=&amp;userLang=">Request_Quote</a> 1-510-569-4845 <a href="/cgi-bin/quoteForm.cgi?type=i&amp;sEmail=chadsparts@someplace.com&amp;email=&amp;part=Engine%20Assembly&amp;dbPart=300.1&amp;dbSubPart=&amp;model=Ford%20Focus&amp;dbModel=27.20&amp;year=2005&amp;stockNum=0232&amp;price=800&amp;desc=139K&amp;name=Chads%20Parts=rs&amp;url=http://someurl.com&amp;int=-1&amp;broker=0&amp;=0&amp;selleruserid=3566&amp;miles=-1&amp;condition=-1&amp;userid=1000&amp;uIMS=&amp;seqNum=600000000000000000456918622&amp;userClaim=&amp;userLang=">Request_Insurance_Quote</a><br/><a href="http://someurl.com/cgi-bin/applet.cgi?sid=3566&amp;brf=&amp;bds=&amp;bsr=price&amp;pin=&amp;pyr=2005&amp;pmd=Ford%20Focus&amp;ppt=Engine%20Assembly&amp;ppr=800&amp;pst=0232&amp;pgr=&amp;bty=WEB&amp;bem=&amp;bzp=&amp;ses=600000000000000000456918622" onclick="window.open(this.href,this.target,getPrm()); return false" target="_blank"><img border="0" src="/images/LiveChat_space.gif"/></a></td>]
    

    我只是想强调一下:

    我只想将这些元素中的文本用逗号分隔成一个字符串,以便在准备编写csv文件时再次使用。

    年份,零件,汽车制造,汽车型号,描述,里程,零件等级,库存#,价格,经销商名称,国家,州,城市,电话

    • 第一个单元格和最后一个单元格是最难弄清楚如何将字符串取出,放入列表并返回到上面相同顺序的字符串。谢谢!
  • 共有1个答案

    乐正远
    2023-03-14

    如果你想有3次2005引擎装配福特福克斯(在你的html例子中),你可以这样做:

    1. 由于包含的HTML没有很好的结构,您应该从中选取最后一个表

    table=汤。findAll('table')[-1]

    tr=表格。findAll('tr')[1://code>

    它将是阵列。之后可以循环遍历行。

    td=tr[0]。td

    <代码>

    不幸的是,我不知道如何处理这个字符串。例如,您可以使用以下方法:

    td=tr[0]。运输署。儿童

    你会得到所有单词和标签的数组,并按照你想要的方式处理它。

     类似资料:
    • 如何将过滤器列表拆分为单个过滤器元件?split2String在线程“main”java.util.regex中导致:异常。PatternSyntaxException:索引10或(|和)附近的未闭合组(

    • 我习惯于在JavaScript中这样做: 斯威夫特没有这个功能,怎么做类似的东西?

    • 问题内容: 我在网上找到了一些答案,但是我没有使用正则表达式的经验,我相信这里是需要的。 我有一个字符串,需要用分隔 或也就是说,它必须是分号或逗号后跟一个空格。没有尾随空格的单个逗号应保持不变 示例字符串: 应该拆分为包含以下内容的列表: 问题答案: 幸运的是,Python内置了:) 更新: 在你的评论之后:

    • 问题内容: 我必须读取字符串并仅使用for循环输出每个字母的频率。讲师暗示我需要使用两个循环,并向我们提供了以下代码: 编辑: 我想我会死于这个问题,并发布一年前找到的解决方案,原因是该问题的点击率很高。 问题答案:

    • 问题内容: 我有一个值为的字符串。我想将字符串分成两个字符串,值为的字符串和的值为字符串。 正确的功能/语法是什么? 我已经看过了,但是找不到将数据返回到两个单独的字符串中的实际语法。 问题答案: 该功能适用于:

    • 我是 Perl 的新手,但根据我阅读的文档,看起来 Perl 中的 split 函数要求正则表达式模式而不是字符串分隔符作为第一个参数,但我发现使用 之类的东西仍然可以正确拆分字符串。 基于此,我尝试使用可变分隔符(例如。< code>print (split($var,$ string))[0] where < code > $ var = ' ' )并发现它不起作用。我做错了什么? 谢谢! 编