【问题标题】:String Keyword Searching in PythonPython中的字符串关键字搜索
【发布时间】:2019-03-13 09:29:18
【问题描述】:

我正在尝试在列表中的任何索引中查找关键字并获取该索引。我使用 BeautifulSoup4 创建了一个小型网络抓取工具来抓取同人小说数据。

由于并非所有同人小说都列出了流派或角色,甚至是更新日期(如果它们是新出版的),所有信息都将在不同的索引中。

因此我需要搜索'Words:' 并获取整个字符串的索引,即'Words: 1,854' == list[3] 或类似的东西,并将其保存为变量words = list[3] 稍后调用,以便稍后将其放入正确列中的 excel 文件中。这是我目前的刮刀,目前只设置为刮一页,只是减少“u”的原始值以添加更多要刮的页面。

import requests
from bs4 import BeautifulSoup
# import time
# from random import randint
# import xlsxwriter
# import urllib3
# from tinydb import TinyDB, Query

total = 0
u = int(1127)

while u < 2000:
    u = u+1
    url = 'https://www.fanfiction.net/Naruto-Crossovers/1402/0/?&srt=1&lan=1&r=10&p=' + str(u)
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')

    raw = soup.find_all('div', class_='z-indent z-padtop')
    for n in range(len(raw)):
        stats = raw[n]
        info = stats.div
        text = info.text
        formatted = text.split(' - ')
        print(formatted[1:(len(formatted))])

【问题讨论】:

  • 我会先将报废结果保存到列表,而不是字符串。然后,最好定义列,通过这些列将数据排序到 Excel 文件中。最后,根据该列名称,您将能够从废料结果列表中检索数据(尽管该列表也需要进行格式化)。不幸的是,我无法展示一些代码示例,b/c 到目前为止我是 python 新手,但这就是我将如何实现它的方式......这对你来说是可行的解决方案吗?
  • @kosist 返回的所有结果都已经保存到一个列表中。我需要弄清楚如何在列表的字符串中找到特定的单词并找到匹配字符串的索引来保存在 excel 文件的特定列中,因为并非所有返回的列表在同一索引处都具有相同的元素(故事的统计数据),甚至根本没有相同的元素。
  • ['Naruto & Mythology', 'Rated: K+', 'English', 'Adventure', 'Chapters: 1', 'Words: 2,835', 'Reviews: 2', 'Favs: 6','关注:1','发布:2004 年 3 月 18 日','卡卡西 H.','完成'] ['Yu-Gi-Oh & Naruto','评级:T','English', '浪漫/幽默','章节:1','字数:32','评论:8','Favs:2','关注:1','更新:1/5/2004','发布:12 /28/2003'] 这是代表​​两个不同故事的两个列表,请注意它们如何将单词作为元素和发布日期,但一个将更新日期和故事的状态(完整)作为元素。这会影响我需要的索引。
  • 整体结果应该是什么?您能否根据这两个列表举一个例子;多个关键字?
  • @kosist 我想搜索“Rated:”并将结果附加到列表中。然后我会有“评级= ['评级:K +','评级:T']”。然后我会搜索“单词:”,然后会有“单词 = ['单词:2,835','单词:32']。等等。我会在适用时将结果附加到适当的列表中并附加一个空格当没有找到值时,例如第二个列表没有更新日期。它会显示为“updates = ['Updated: 1/5/2004', '']”,因为没有匹配 '更新:' 在第二个列表中。这样只有空白的 excel 单元格,没有不匹配的数据。

标签: python string python-3.x list search


【解决方案1】:

那么解决办法可能是这样的(检查函数find_keyword

import requests
from bs4 import BeautifulSoup
# import time
# from random import randint
# import xlsxwriter
# import urllib3
# from tinydb import TinyDB, Query

total = 0
u = int(1127)

results = []
while u < 1130: #decreased u due to testing time
    u = u+1
    url = 'https://www.fanfiction.net/Naruto-Crossovers/1402/0/?&srt=1&lan=1&r=10&p=' + str(u)
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')

    raw = soup.find_all('div', class_='z-indent z-padtop')
    for n in range(len(raw)):
        stats = raw[n]
        info = stats.div
        text = info.text
        formatted = text.split(' - ')
        if formatted:
            results.append(formatted)
print(results)

# function to search for a keyword
def find_keyword(list, keyword):
    results = []
    for element in list:
        value = ''
        for tag in element:
            if tag.find(keyword) >= 0:
                value = tag
        results.append(value)

    return(results)

words_list = find_keyword(results, 'Words') #example of how to search and build list for keyword
print(words_list)

【讨论】:

  • 这个代码块对我不起作用,但 find 函数正是我想要的。我现在已将所有数据排序到相应的列表中。
【解决方案2】:
This is the code I came up with, it wordks wonderfully. The find function was essential.

# For later use, searches for keywords and adds them to the specified list
    def assign_stats(keyword, stat_list):
        k = 13
        b = 0
        t = 0
        while k >= 1:
            if t == len(formatted):
                t = 0
            check = formatted[t]
            value = check.find(keyword)
            if value != -1:
                # values = formatted[t]
                stat_list.append(check)
                b = 1
            elif k < 2 and b == 0:
                stat_list.append('')

            t = t + 1
            k = k - 1


    # For later use, searches for keywords and adds them to the specified list
    def assign_stats_status(keyword, stat_list):
        k = 13
        b = 0
        t = 0
        while k >= 1:
            if t == len(formatted):
                t = 0
            check = formatted[t]
            value = check.find(keyword)
            if value != -1:
                # values = formatted[t]
                stat_list.append(check)
                b = 1
            elif k < 2 and b == 0:
                stat_list.append('In-Progress')
            t = t + 1
            k = k - 1


    # For later use, searches for specified indexes of story data lists and adds them to specified list
    def assign_stats_concrete(index, stat_list):
        stat_list.append(formatted[index])

    # Searches for keywords/indexes for the specified story stat lists
    assign_stats('Words', words)
    assign_stats_concrete(2, rating)
    assign_stats('English', language)
    assign_stats('Chapters', chapters)
    assign_stats('Reviews', reviews)
    assign_stats('Favs', favorites)
    assign_stats('Follows', follows)
    assign_stats('Updated', updated)
    assign_stats_status('Complete', status)
    assign_stats('Published', published)
    assign_stats_concrete(1, crossover)

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2020-12-21
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多