from bs4 import BeautifulSoup


html = '''<tbody id="plaintiff-body">
   <tr>
      <td><img id="plaimg0001" src="/CaseInformationOnline/images/minus.png" onclick="showhide('pladetail0001','','plaimg0001')"></td>
      <td>JENEE BENNETT</td>
      <td></td>
      <td>COURTNEY L HANNA</td>
   </tr>
   <tr id="pladetail0001" style="" valign="top">
      <td></td>
      <td>2348 WOODBROOK CIR N<br>UNIT D<br>COLUMBUS, OH 43223</td>
      <td></td>
      <td>JOSEPH &amp; JOSEPH CO LPA   <br>SUITE 200<br>155 W MAIN ST<br>COLUMBUS, OH 43215<br>(614) 449-8282<br><br>DEBORAH L MCNINCH<br>JOSEPH &amp; JOSEPH CO LPA   <br>THE WATERFORD, SUITE 200 <br>155 W MAIN ST<br>COLUMBUS, OH 43215<br>(614) 449-8282<br><br>S K DODDERER<br>155 W MAIN STREET<br>#200<br>COLUMBUS, OH 43215<br>(614) 449-8282</td>
   </tr>
</tbody>'''

soup = BeautifulSoup(html, 'lxml')
att = [x.get_text(strip=True, separator=' ') for x in soup.select(
    '#plaintiff-body tr:first-child > td:nth-child(4), #plaintiff-body tr:nth-child(2) > td:last-child')]
print(att)

电流输出:

['COURTNEY L HANNA', 'JOSEPH & JOSEPH CO LPA SUITE 200 155 W MAIN ST COLUMBUS, OH 43215 (614) 449-8282 DEBORAH L MCNINCH JOSEPH & JOSEPH CO LPA THE WATERFORD, SUITE 200 155 W MAIN ST COLUMBUS, OH 43215 (614) 449-8282 S K DODDERER 155 W MAIN STREET #200 COLUMBUS, OH 43215 (614) 449-8282']

期望输出:

['COURTNEY L HANNA', 'JOSEPH & JOSEPH CO LPA SUITE 200 155 W MAIN ST COLUMBUS, OH 43215 (614) 449-8282']

如何做到这一点?

我想用https://www.crummy.com/software/BeautifulSoup/bs4/doc/#a-function来传递一个函数,然后在匹配上循环,一旦我发现br为空,我就会停止循环.

否则我可以得到x而不是x.get_text(),然后在><上拆分得到第一个索引,然后使用https://w3lib.readthedocs.io/en/latest/w3lib.html?highlight=remove#w3lib.html.remove_tags

很高兴知道是有CSS个直接的解决方案还是一个简单的解决方案.

推荐答案

很高兴知道CSS是否有直接的解决方案...

这里的主要问题是CSS中的sibling 组合符br+br忽略了元素之间的所有非元素 node ,包括注释、文本和空格,因此就CSS而言,您将无法从那里获得连续的两个 node .

因此,我的方法也是你的 idea ,即使用一个功能来判断标签:

from bs4 import BeautifulSoup
html = '''<tbody id="plaintiff-body">
   <tr>
      <td><img id="plaimg0001" src="/CaseInformationOnline/images/minus.png" onclick="showhide('pladetail0001','','plaimg0001')"></td>
      <td>JENEE BENNETT</td>
      <td></td>
      <td>COURTNEY L HANNA</td>
   </tr>
   <tr id="pladetail0001" style="" valign="top">
      <td></td>
      <td>2348 WOODBROOK CIR N<br>UNIT D<br>COLUMBUS, OH 43223</td>
      <td></td>
      <td>JOSEPH &amp; JOSEPH CO LPA   <br>SUITE 200<br>155 W MAIN ST<br>COLUMBUS, OH 43215<br>(614) 449-8282<br><br>DEBORAH L MCNINCH<br>JOSEPH &amp; JOSEPH CO LPA   <br>THE WATERFORD, SUITE 200 <br>155 W MAIN ST<br>COLUMBUS, OH 43215<br>(614) 449-8282<br><br>S K DODDERER<br>155 W MAIN STREET<br>#200<br>COLUMBUS, OH 43215<br>(614) 449-8282</td>
   </tr>
</tbody>'''

soup = BeautifulSoup(html, 'lxml')

def check(x):
    s = []
    for a,b in zip(x,x[1::]):
        if a==b:
            break
        if a.name == None:
            s.append(a.text.strip())
    return ' '.join(s)

att = [check(x.contents) if len(x.contents) > 1 else x.get_text(strip=True) for x in soup.select('#plaintiff-body tr:first-child > td:nth-child(4), #plaintiff-body tr:nth-child(2) > td:last-child')]
print(att)

Output

['COURTNEY L HANNA', 'JOSEPH & JOSEPH CO LPA SUITE 200 155 W MAIN ST COLUMBUS, OH 43215 (614) 449-8282']

Python相关问答推荐

Pandas 第二小值有条件

Pytest两个具有无限循环和await命令的Deliverc函数

将两只Pandas rame乘以指数

如何获得每个组的时间戳差异?

将9个3x3矩阵按特定顺序排列成9x9矩阵

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

如何在PySide/Qt QColumbnView中删除列

在Python中计算连续天数

如何获取Python synsets列表的第一个内容?

用SymPy在Python中求解指数函数

如何在Great Table中处理inf和nans

使用tqdm的进度条

提取最内层嵌套链接

如何使用pytest在traceback中找到特定的异常

Seaborn散点图使用多个不同的标记而不是点

Polars定制函数返回多列

两个名称相同但值不同的 Select 都会产生相同的值(discord.py)

如何在不不断遇到ChromeDriver版本错误的情况下使用Selify?

是否从Python调用SHGetKnownFolderPath?