python - Python/BeautifulSoup 有没有办法在相似行的列表中选择特定行?

标签 python html beautifulsoup

抱歉标题令人困惑。我是Python的初学者,甚至不知道问这个问题的语言。

我正在尝试对 Box Office Mojo 网站进行一些数据清理。我正在创建一个 csv 文件,用于提取每个国家/地区每年最高票房收入的表格(请参阅 https://www.boxofficemojo.com/intl/austria/yearly/?yr=2019&p=.htm

我已经能够使用 BeautifulSoup 来抓取特定页面并解析它:

pip install bs4
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

##Creating a variable for the URL I want to use
my_url = 'https://www.boxofficemojo.com/intl/austria/yearly/?yr=2019&p=.htm'

uReq(my_url)
### Opening up connecting, grabbing the page, closing the connection
uClient = uReq(my_url)
page_html = uClient.read() ###Don't run page_html because it may crash the client
uClient.close()
##Using BeuatifulSoup to read the html page and parsing it
page_soup = soup(page_html,"html.parser")

我已经能够隔离我想要从中获取信息的特定 html 行:

container_odd = page_soup.findAll("tr", {"bgcolor":"#ffffff"})
container_even = page_soup.findAll("tr", {"bgcolor":"#f4f4ff"})

我可以看到它抓取了我想要的文本,并且无需所有 html 格式即可获取它。

>>>>container_even[0]
<tr bgcolor="#f4f4ff"><td align="center"><font size="2">2</font></td>
<td><font size="2">How to Train Your Dragon: The Hidden World</font></td>
<td><font size="2">UPI</font></td>
<td align="right"><font size="2"><b>$2,701,010</b></font></td>
<td align="center"><font size="2">2/8</font></td>
</tr>
>>> container_odd[0].text
'1\nCaptain Marvel\nDisney\n$3,221,398\n3/7\n'

我还可以调用该行中的第一个“td item”(我不知道该怎么调用它):

>>> container_odd[0].td.text
'1'

我一生都无法弄清楚如何拉出该行中的第二个“td item”,即“惊奇队长”。

我现在想做的是创建一个循环,将从 container_even/odd 中的每一行中提取每个单独的 td 项以放入列表中。

所以,我想要一个rank_list包含“1,2,3,4...”(或者更确切地说“1,3,5...”和“2,4,6...”,因为本例中的代码)

以及包含“惊奇队长,如何训练你的龙......”的标题列表

我不明白的是如何提取第二个“td item”,然后如何在每行中循环该项目?

我尝试至少提取排名项目列表:

    rank  = td[]

    print("rank: " + rank)

但是出现语法错误

  File "scraper.py", line 25
    rank  = td[]
               ^
SyntaxError: invalid syntax

任何帮助创建循环或至少弄清楚如何拉出第二个 td 项目将不胜感激!

最佳答案

查看评论中的代码:

container_odd[0].text '1\nCaptain Marvel\nDisney\n$3,221,398\n3/7\n'

您应该能够迭代“container_odd”对象并使用 for 循环获取所有行。例如:

for line in container_odd:
    raw_text = line.text
    content_list = raw_text.split('\n')
    print(content_list)

“line”对象将是“container_odd”对象的每一行,“raw_text”看起来就像你拉出的内容(我在评论中显示的内容),并通过将其拆分为每个'\n' 字符,您将获得一个与您提取的表相匹配的列表。

要将其保存到 csv,请尝试以下操作:

def my_csv_writer(text):
    with open(*full\\path\\filename.csv*, 'a+') as file:
        file.write(text)
        file.write('\n')

for line in container_odd:
    raw_text = line.text
    content_list = raw_text.replace(',','').split('\n')
    write_text = ','.join(content_list)
    my_csv_writer(write_text)

该函数将充当您的“写入”函数,当您执行 for 循环并调用写入函数时,您可以一次一行将文本写入文件。

关于python - Python/BeautifulSoup 有没有办法在相似行的列表中选择特定行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55747797/

相关文章:

python - 删除除 BeautifulSoup 的一个标签之外的所有 html 标签

python - Python 文档中的错误?

python - 使用 patch decorator 和 side_effect 模拟文件读取

python - Python SQLAlchemy中的依赖问题?

html - Bootstrap Carousel - 下一个容器不可见

HTML选择标签更改箭头使用雪碧

python - 矢量化数组 : construct matrix with 1 in specified places and 0 elsewhere

html - 从 HTML/CSS 触发 Chrome 中的 GPU 光栅化以实现背景图像动画

Python - 使用 BeautifulSoup4 获取父元素的第一个子元素

python - BeautifulSoup 返回关闭标签而不是标签文本