【问题标题】:Scrape web page <ul> <li> (Python)抓取网页 <ul> <li> (Python)
【发布时间】:2018-12-28 23:56:49
【问题描述】:

问题:

有一个网站https://au.pcpartpicker.com/products/cpu/overall-list/#page=1,在&lt;ul&gt; 下有一个列表&lt;li&gt;,列表中的每个项目都包含一个&lt;div&gt;,其中类title 在该类中还有2 个@987654325 @ 元素第一个有一些文本示例 3.4 GHz 6-Core (Pinnacle Ridge) 我想删除所有不在括号中的文本以获得 Pinnacle Ridge。删除列表后,我想通过更改 #page= 进入下一页。

代码:

我不太确定是否只有 sn-ps,但它是:

从 requests_html 导入 HTMLSession 会话 = HTMLSession()

r = session.get('https://au.pcpartpicker.com/product/cpu/overall-list/#page=' + page)

table = r.html.find('.ul')

//not sure find each <li> get first <div>

junk, name = div.split('(')

name.replace("(", "")

name.replace(")", "")

预期结果:

我想遍历每个页面,直到没有人找到每个列表并获得不需要保存的名称,因为我有代码在创建它时保存它。

如果您需要更多信息,请告诉我

谢谢

【问题讨论】:

    标签: python html python-3.x beautifulsoup python-requests-html


    【解决方案1】:

    该站点是动态的,因此,您必须使用 selenium 才能产生所需的结果:

    from bs4 import BeautifulSoup as soup
    from selenium import webdriver
    import time, re
    d = webdriver.Chrome('/path/to/chromdriver')
    d.get('https://au.pcpartpicker.com/products/cpu/overall-list/#page=1')
    def cpus(_source):
      result = soup(_source, 'html.parser').find('ul', {'id':'category_content'}).find_all('li')
      _titles = list(filter(None, [(lambda x:'' if x is None else x.text)(i.find('div', {'class':'title'})) for i in result]))
      data = [list(filter(None, [re.findall('(?<=\().*?(?=\))', c.text) for c in i.find_all('div')])) for i in result]
      return _titles, [a for *_, [a] in filter(None, data)]
    
    
    _titles, _cpus = cpus(d.page_source))
    conn.executemany("INSERT INTO cpu (name, family) VALUES (?, ?)", list(zip(_titles, _cpus)))
    _last_page = soup(d.page_source, 'html.parser').find_all('a', {'href':re.compile('#page\=\d+')})[-1].text
    for i in range(2, int(_last_page)+1):
       d.get(f'https://au.pcpartpicker.com/products/cpu/overall-list/#page={i}') 
       time.sleep(3)
       _titles, _cpus = cpus(d.page_source))
       conn.executemany("INSERT INTO cpu (name, family) VALUES (?, ?)", list(zip(_titles, _cpus)))
    

    【讨论】:

    • 我刚刚意识到是否也可以每次都获取名称以便将其匹配到我的数据库中?
    • 姓名和家庭的两个变量是什么?是_titles吗?
    • @Uskompuf 抱歉不清楚。输出为字典列表,每个字典的key为title,value为CPU名。
    • 因为你的程序没有打印任何东西,所以无论如何要将名称和家庭分成2个变量,并且每次循环中有一个新变量时它们都会更新,所以我可以将它们插入MySQL?
    • @Uskompuf 请查看我最近的编辑。现在,有变量_titles_cpus,每个列表存储每次迭代时的标题和cpu。
    猜你喜欢
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2021-09-01
    • 2021-01-12
    相关资源
    最近更新 更多